From df543507bd88ae35b151f524b5f135e7e8bc5eae Mon Sep 17 00:00:00 2001 From: SEEKFREE_BUDING <2289331269@qq.com> Date: Wed, 3 May 2023 12:15:13 +0800 Subject: [PATCH] =?UTF-8?q?V3.1.8=20=20=20=20=20=20=20=20=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=91=84=E5=83=8F=E5=A4=B4=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E6=8A=A5=E6=96=AD=E8=A8=80=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=20=20=20=20=20=20=20=20=E4=BF=AE=E5=A4=8D=E5=A4=9A?= =?UTF-8?q?=E4=B8=AASPI=E5=90=8C=E6=97=B6=E4=BD=BF=E7=94=A8=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E4=BA=A7=E7=94=9F=E5=86=B2=E7=AA=81=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=20=20=20=20=20=20=20=20=E4=BF=AE=E5=A4=8D=E5=A4=9A?= =?UTF-8?q?=E6=A0=B8=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E5=8D=A1=E6=AD=BB?= =?UTF-8?q?=E5=9C=A8=E7=AD=89=E5=BE=85=E5=90=8C=E6=AD=A5=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=20=20=20=20=20=20=20=20=20=E5=A4=96?= =?UTF-8?q?=E8=AE=BE=E5=B1=82=E5=A2=9E=E5=8A=A0=E4=B8=AD=E6=96=87=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../E01_gpio_demo/libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../E02_uart_demo/libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../E03_adc_demo/libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../E04_pwm_demo/libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../E05_pit_demo/libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../E06_exit_demo/libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../E08_eeprom_demo/libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../E09_timer_demo/libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../E15_fft_demo/libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../libraries/doc/version.txt | 4 + .../libraries/zf_common/zf_common_clock.c | 20 +- .../zf_device/zf_device_absolute_encoder.c | 29 +- .../zf_device/zf_device_absolute_encoder.h | 21 +- .../zf_device/zf_device_bluetooth_ch9141.c | 79 ++--- .../zf_device/zf_device_bluetooth_ch9141.h | 34 +- .../libraries/zf_device/zf_device_camera.c | 22 +- .../libraries/zf_device/zf_device_camera.h | 21 +- .../libraries/zf_device/zf_device_dl1a.c | 83 +++-- .../libraries/zf_device/zf_device_dl1a.h | 64 ++-- .../zf_device/zf_device_gps_tau1201.c | 11 +- .../zf_device/zf_device_gps_tau1201.h | 81 ++--- .../libraries/zf_device/zf_device_icm20602.c | 143 +++++---- .../libraries/zf_device/zf_device_icm20602.h | 66 +++- .../libraries/zf_device/zf_device_imu660ra.c | 155 ++++----- .../libraries/zf_device/zf_device_imu660ra.h | 100 ++++-- .../libraries/zf_device/zf_device_imu963ra.c | 250 ++++++++------- .../libraries/zf_device/zf_device_imu963ra.h | 90 +++++- .../libraries/zf_device/zf_device_ips114.c | 296 +++++++++--------- .../libraries/zf_device/zf_device_ips114.h | 50 +-- .../libraries/zf_device/zf_device_ips200.c | 240 +++++++------- .../libraries/zf_device/zf_device_ips200.h | 111 ++++--- .../libraries/zf_device/zf_device_key.c | 19 +- .../libraries/zf_device/zf_device_key.h | 19 +- .../libraries/zf_device/zf_device_mpu6050.c | 36 ++- .../libraries/zf_device/zf_device_mpu6050.h | 20 +- .../libraries/zf_device/zf_device_mt9v03x.c | 78 +++-- .../libraries/zf_device/zf_device_mt9v03x.h | 50 +-- .../libraries/zf_device/zf_device_oled.c | 183 +++++------ .../libraries/zf_device/zf_device_oled.h | 101 +++--- .../libraries/zf_device/zf_device_ov7725.c | 126 ++++---- .../libraries/zf_device/zf_device_ov7725.h | 30 +- .../libraries/zf_device/zf_device_scc8660.h | 21 +- .../libraries/zf_device/zf_device_tft180.c | 269 +++++++++------- .../libraries/zf_device/zf_device_tft180.h | 49 +-- .../libraries/zf_device/zf_device_tsl1401.c | 2 +- .../libraries/zf_device/zf_device_tsl1401.h | 13 +- .../libraries/zf_device/zf_device_type.c | 28 +- .../libraries/zf_device/zf_device_type.h | 16 +- .../zf_device_virtual_oscilloscope.c | 2 +- .../zf_device_virtual_oscilloscope.h | 8 +- .../libraries/zf_device/zf_device_wifi_uart.c | 218 +++++++------ .../libraries/zf_device/zf_device_wifi_uart.h | 26 +- .../zf_device/zf_device_wireless_uart.c | 101 +++--- .../zf_device/zf_device_wireless_uart.h | 36 ++- .../libraries/zf_driver/zf_driver_spi.c | 95 +++--- .../libraries/zf_driver/zf_driver_spi.h | 1 + .../user/cpu0_main.c | 1 - 753 files changed, 31024 insertions(+), 25249 deletions(-) diff --git a/Example/E01_gpio_demo/libraries/doc/version.txt b/Example/E01_gpio_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E01_gpio_demo/libraries/doc/version.txt +++ b/Example/E01_gpio_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c b/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E02_uart_demo/libraries/doc/version.txt b/Example/E02_uart_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E02_uart_demo/libraries/doc/version.txt +++ b/Example/E02_uart_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c b/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_key.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_key.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_type.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_type.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E03_adc_demo/libraries/doc/version.txt b/Example/E03_adc_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E03_adc_demo/libraries/doc/version.txt +++ b/Example/E03_adc_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c b/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_key.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_key.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_type.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_type.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E04_pwm_demo/libraries/doc/version.txt b/Example/E04_pwm_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E04_pwm_demo/libraries/doc/version.txt +++ b/Example/E04_pwm_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c b/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E05_pit_demo/libraries/doc/version.txt b/Example/E05_pit_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E05_pit_demo/libraries/doc/version.txt +++ b/Example/E05_pit_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c b/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_key.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_key.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_type.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_type.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E06_exit_demo/libraries/doc/version.txt b/Example/E06_exit_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E06_exit_demo/libraries/doc/version.txt +++ b/Example/E06_exit_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c b/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_key.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_key.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_type.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_type.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E07_encoder_demo/libraries/doc/version.txt b/Example/E07_encoder_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E07_encoder_demo/libraries/doc/version.txt +++ b/Example/E07_encoder_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c b/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E08_eeprom_demo/libraries/doc/version.txt b/Example/E08_eeprom_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E08_eeprom_demo/libraries/doc/version.txt +++ b/Example/E08_eeprom_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E09_timer_demo/libraries/doc/version.txt b/Example/E09_timer_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E09_timer_demo/libraries/doc/version.txt +++ b/Example/E09_timer_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c b/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_key.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_key.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_type.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_type.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E10_printf_debug_log_demo/libraries/doc/version.txt b/Example/E10_printf_debug_log_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E10_printf_debug_log_demo/libraries/doc/version.txt +++ b/Example/E10_printf_debug_log_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt b/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt +++ b/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt b/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E13_dual_core_demo/libraries/doc/version.txt b/Example/E13_dual_core_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E13_dual_core_demo/libraries/doc/version.txt +++ b/Example/E13_dual_core_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt b/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Example/E15_fft_demo/libraries/doc/version.txt b/Example/E15_fft_demo/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Example/E15_fft_demo/libraries/doc/version.txt +++ b/Example/E15_fft_demo/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Example/E15_fft_demo/libraries/zf_common/zf_common_clock.c b/Example/E15_fft_demo/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Example/E15_fft_demo/libraries/zf_common/zf_common_clock.c +++ b/Example/E15_fft_demo/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_absolute_encoder.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_absolute_encoder.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_camera.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_camera.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_camera.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_camera.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_dl1a.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_dl1a.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_dl1a.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_dl1a.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_gps_tau1201.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_gps_tau1201.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_icm20602.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_icm20602.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_icm20602.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_icm20602.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_imu660ra.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_imu660ra.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_imu660ra.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_imu660ra.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_imu963ra.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_imu963ra.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_imu963ra.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_imu963ra.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips200.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips200.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips200.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips200.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_key.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_key.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_key.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_key.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_mpu6050.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_mpu6050.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_mpu6050.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_mpu6050.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_mt9v03x.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_mt9v03x.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_mt9v03x.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_mt9v03x.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_oled.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_oled.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_oled.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_oled.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_ov7725.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_ov7725.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_ov7725.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_ov7725.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_scc8660.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_scc8660.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_tft180.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_tft180.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_tft180.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_tft180.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_tsl1401.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_tsl1401.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_tsl1401.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_tsl1401.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_type.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_type.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_type.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_type.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_wifi_uart.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_wifi_uart.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_wifi_uart.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_wifi_uart.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_wireless_uart.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_wireless_uart.c +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_wireless_uart.h b/Example/E15_fft_demo/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Example/E15_fft_demo/libraries/zf_device/zf_device_wireless_uart.h +++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.c b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.c +++ b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.h b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.h +++ b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt b/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt index c1d55d9..b338699 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt +++ b/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt @@ -1,3 +1,7 @@ +V3.1.8 + 修复多个SPI同时使用可能产生冲突的问题 + 修复多核初始化时卡死在等待同步函数的问题 + 外设层增加中文注释 V3.1.7 修复摄像头初始化报断言错误的问题 V3.1.6 diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_clock.c b/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_clock.c index 0078457..6e68809 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_clock.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_clock.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-26 pudding 新增初始化完成标志等待操作,需要等待CPU0初始化完成后其他CPU才能进行赋值 ********************************************************************************************************************/ #include "IfxScuEru.h" @@ -42,9 +43,9 @@ #include "zf_common_clock.h" -App_Cpu0 g_AppCpu0; // 频率信息变量 +App_Cpu0 g_AppCpu0; // 频率信息变量 -static uint8 cpu_init_finsh[IfxCpu_Id_none]; // 核心初始化完成标志位 +static vuint8 cpu_init_finish[IfxCpu_Id_none]; // 核心初始化完成标志位 //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置系统频率 @@ -109,19 +110,24 @@ void clock_init (void) void cpu_wait_event_ready (void) { uint8 i; - uint8 all_cpu_init_finsh; + uint8 all_cpu_init_finish; + + if(IfxCpu_getCoreId() != 0) + { + while(cpu_init_finish[0] == 0); + } // 调用此函数的核心初始化完毕,标志位置一 - cpu_init_finsh[IfxCpu_getCoreId()] = 1; + cpu_init_finish[IfxCpu_getCoreId()] = 1; // 等待其他核心初始化完毕 do { - all_cpu_init_finsh = 1; + all_cpu_init_finish = 1; for(i = 0; i < IfxCpu_Id_none; i++) { - all_cpu_init_finsh *= cpu_init_finsh[i]; + all_cpu_init_finish *= cpu_init_finish[i]; } system_delay_ms(1); - }while(0 == all_cpu_init_finsh); + }while(0 == all_cpu_init_finish); } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_absolute_encoder.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_absolute_encoder.c index 9480f32..782e7ac 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_absolute_encoder.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_absolute_encoder.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,16 +55,16 @@ #include "zf_device_absolute_encoder.h" -static int16 now_location = 0; -static int16 last_location = 0; +static int16 now_location = 0; // 当前位置定义 static:静态声明,仅此文件可用此变量 +static int16 last_location = 0; // 上次位置定义 static:静态声明,仅此文件可用此变量 #if ABSOLUTE_ENCODER_USE_SOFT_SPI -static soft_spi_info_struct absolute_encoder_spi; -#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) -#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) +static soft_spi_info_struct absolute_encoder_spi; // 定义角度编码器软件SPI结构体 +#define absolute_encoder_read() (soft_spi_read_8bit(&absolute_encoder_spi)) // 定义数据读取函数 +#define absolute_encoder_write(data) (soft_spi_write_8bit(&absolute_encoder_spi, (data))) // 定义数据写入函数 #else -#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) -#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) +#define absolute_encoder_read() (spi_read_8bit(ABSOLUTE_ENCODER_SPI)) // 定义数据读取函数 +#define absolute_encoder_write(data) (spi_write_8bit(ABSOLUTE_ENCODER_SPI, (data))) // 定义数据写入函数 #endif //------------------------------------------------------------------------------------------------------------------- @@ -141,12 +142,12 @@ static uint8 absolute_encoder_self_check (void) uint16 time_count = 0; while(0x1C != absolute_encoder_read_register(6)) // 获取状态寄存器 { - for(i = 0; i < 6; i ++) + for(i = 0; 6 > i; i ++) { absolute_encoder_write_register(i + 1, dat[i]); // 写入默认配置参数 system_delay_ms(1); } - if(time_count ++ > ABSOLUTE_ENCODER_TIMEOUT_COUNT) // 等待超时 + if(ABSOLUTE_ENCODER_TIMEOUT_COUNT < time_count ++) // 等待超时 { return_state = 1; break; @@ -164,8 +165,8 @@ static uint8 absolute_encoder_self_check (void) //------------------------------------------------------------------------------------------------------------------- int16 absolute_encoder_get_location (void) { - last_location = now_location; - now_location = absolute_encoder_read_data() >> 4; + last_location = now_location; // 更新数据前保存上一次的位置 + now_location = absolute_encoder_read_data() >> 4; // 读取当前位置 return now_location; } @@ -179,9 +180,9 @@ int16 absolute_encoder_get_location (void) int16 absolute_encoder_get_offset (void) { int16 result_data = 0; - if(func_abs(now_location - last_location) > 2048) + if(2048 < func_abs(now_location - last_location)) { - result_data = (now_location > 2048 ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); + result_data = (2048 < now_location ? (now_location - 4096 - last_location) : (now_location + 4096 - last_location)); } else { diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_absolute_encoder.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_absolute_encoder.h index 768078c..cc31af5 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_absolute_encoder.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_absolute_encoder.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_typedef.h" +//=================================================定义 角度传感器 基本配置================================================ #define ABSOLUTE_ENCODER_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 #if ABSOLUTE_ENCODER_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -68,26 +70,25 @@ //====================================================硬件 SPI 驱动==================================================== #endif -#define ABSOLUTE_ENCODER_CS_PIN (P20_13) +#define ABSOLUTE_ENCODER_CS_PIN (P20_13) // CS引脚定义 #define ABSOLUTE_ENCODER_CSN(x) ((x) ? (gpio_high(ABSOLUTE_ENCODER_CS_PIN)): (gpio_low(ABSOLUTE_ENCODER_CS_PIN))) -#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) +#define ABSOLUTE_ENCODER_TIMEOUT_COUNT (100) // 自检超时时间 #define ABSOLUTE_ENCODER_DEFAULT_ZERO (0) -//====================================================角度传感器参数==================================================== #define ABSOLUTE_ENCODER_SPI_W (0x80) #define ABSOLUTE_ENCODER_SPI_R (0x40) #define ABSOLUTE_ENCODER_ZERO_L_REG (0x00) #define ABSOLUTE_ENCODER_ZERO_H_REG (0x01) #define ABSOLUTE_ENCODER_DIR_REG (0X09) -//====================================================角度传感器参数==================================================== +//=================================================定义 角度传感器 基本配置================================================ -//==================================================角度传感器 基础函数==================================================== -int16 absolute_encoder_get_location (void); -int16 absolute_encoder_get_offset (void); -uint8 absolute_encoder_init (void); -//==================================================角度传感器 基础函数==================================================== +//=================================================声明 角度传感器 基础函数================================================ +int16 absolute_encoder_get_location (void); // 绝对值编码器获取当前角度值 +int16 absolute_encoder_get_offset (void); // 绝对值编码器获取相较上次位置的偏移值 +uint8 absolute_encoder_init (void); // 绝对值编码器初始化 +//=================================================声明 角度传感器 基础函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_bluetooth_ch9141.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_bluetooth_ch9141.c index d5bf430..b99aab5 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_bluetooth_ch9141.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_bluetooth_ch9141.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,32 +51,13 @@ #include "zf_driver_uart.h" #include "zf_driver_delay.h" #include "zf_device_type.h" - +#include "zf_device_camera.h" #include "zf_device_bluetooth_ch9141.h" -static fifo_struct bluetooth_ch9141_fifo; +static fifo_struct bluetooth_ch9141_fifo; // fifo缓冲区结构体定义 static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // 数据存放数组 -static uint8 bluetooth_ch9141_data; - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块发送数组 -// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义 -// 参数说明 *buff 要发送的数组地址 -// 参数说明 len 发送长度 -// 返回参数 void -// 使用示例 bluetooth_ch9141_write_buffer(UART_1, &a[0], 5); -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -static void bluetooth_ch9141_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len) -{ - while(len) - { - uart_write_byte_wait(uart_n, *buff); - len--; - buff++; - } -} +static uint8 bluetooth_ch9141_data = 0; // 数据临时存放变量 //------------------------------------------------------------------------------------------------------------------- // 函数简介 蓝牙转串口模块 发送数据 @@ -101,16 +83,16 @@ uint32 bluetooth_ch9141_send_byte (const uint8 data) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 蓝牙转串口模块 发送函数 +// 函数简介 蓝牙转串口模块 发送数组 // 参数说明 buff 需要发送的数据地址 // 返回参数 len 发送长度 // 使用示例 uint32 剩余未发送的字节数 // 使用示例 bluetooth_ch9141_send_buff(buff, 16); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { @@ -118,14 +100,14 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) { if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -147,36 +129,36 @@ uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 bluetooth_ch9141_send_string("Trust yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 bluetooth_ch9141_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(BLUETOOTH_CH9141_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { - if(30 <= len) // 数据分 30byte 每包发送 + if(30 <= len) // 数据分 30byte 每包发送 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 - str += 30; // 地址偏移 - len -= 30; // 数量 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, 30); // 发送数据 + str += 30; // 地址偏移 + len -= 30; // 数量 time_count = 0; } - else // 不足 30byte 的数据一次性发送完毕 + else // 不足 30byte 的数据一次性发送完毕 { - bluetooth_ch9141_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len);// 发送数据 + uart_write_buffer(BLUETOOTH_CH9141_INDEX, (const uint8 *)str, len); // 发送数据 len = 0; break; } } - else // 如果RTS为高电平 则模块忙 + else // 如果RTS为高电平 则模块忙 { - if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 + if(BLUETOOTH_CH9141_TIMEOUT_COUNT <= (++ time_count)) // 超出了最大等待时间 { - break; // 退出发送 + break; // 退出发送 } system_delay_ms(1); } @@ -190,15 +172,14 @@ uint32 bluetooth_ch9141_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 bluetooth_ch9141_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); - extern uint8 camera_send_image_frame_header[4]; - bluetooth_ch9141_send_buff(camera_send_image_frame_header, 4); - bluetooth_ch9141_send_buff((uint8 *)image_addr, image_size); + bluetooth_ch9141_send_buffer(camera_send_image_frame_header, 4); + bluetooth_ch9141_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -206,12 +187,12 @@ void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 buff 存储的数据地址 // 参数说明 len 长度 // 返回参数 uint32 实际读取字节数 -// 使用示例 bluetooth_ch9141_read_buff(buff, 16); -// 备注信息 +// 使用示例 bluetooth_ch9141_read_buffer(buff, 16); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len) +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_bluetooth_ch9141.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_bluetooth_ch9141.h index e01764c..9732284 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_bluetooth_ch9141.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_bluetooth_ch9141.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,29 +50,26 @@ #include "zf_common_typedef.h" - -//=================================================9141蓝牙 驱动配置==================================================== +//=================================================定义 9141蓝牙 基本配置================================================ #define BLUETOOTH_CH9141_INDEX (UART_2) // 蓝牙模块对应使用的串口号 #define BLUETOOTH_CH9141_BUAD_RATE (115200) // 蓝牙模块对应使用的串口波特率 #define BLUETOOTH_CH9141_TX_PIN (UART2_RX_P10_6) // 蓝牙模块对应模块的 TX 要接到单片机的 RX #define BLUETOOTH_CH9141_RX_PIN (UART2_TX_P10_5) // 蓝牙模块对应模块的 RX 要接到单片机的 TX -#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚 -//=================================================9141蓝牙 驱动配置==================================================== +#define BLUETOOTH_CH9141_RTS_PIN (P10_2) // 蓝牙模块对应模块的 RTS 引脚(流控位) -#define BLUETOOTH_CH9141_BUFFER_SIZE (64) -#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) +#define BLUETOOTH_CH9141_BUFFER_SIZE (64) // 接收数据的缓冲区大小 +#define BLUETOOTH_CH9141_TIMEOUT_COUNT (500) // 执行操作的超时时间 +//=================================================定义 9141蓝牙 基本配置================================================ -//=================================================9141蓝牙 基础函数==================================================== -uint32 bluetooth_ch9141_send_byte (const uint8 data); -uint32 bluetooth_ch9141_send_buff (const uint8 *buff, uint32 len); -uint32 bluetooth_ch9141_send_string (const char *str); -void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); -uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len); - -void bluetooth_ch9141_uart_callback (void); - -uint8 bluetooth_ch9141_init (void); -//=================================================9141蓝牙 基础函数==================================================== +//=================================================声明 9141蓝牙 基础函数================================================ +uint32 bluetooth_ch9141_send_byte (const uint8 data); // 蓝牙转串口模块 发送数据 +uint32 bluetooth_ch9141_send_buffer (const uint8 *buff, uint32 len); // 蓝牙转串口模块 发送数组 +uint32 bluetooth_ch9141_send_string (const char *str); // 蓝牙转串口模块 发送字符串 +void bluetooth_ch9141_send_image (const uint8 *image_addr, uint32 image_size); // 蓝牙转串口模块 发送摄像头图像至上位机查看图像 +uint32 bluetooth_ch9141_read_buffer (uint8 *buff, uint32 len); // 蓝牙转串口模块 读取函数 +void bluetooth_ch9141_uart_callback (void); // 蓝牙转串口模块 串口中断回调函数 +uint8 bluetooth_ch9141_init (void); // 蓝牙转串口模块 初始化 +//=================================================声明 9141蓝牙 基础函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_camera.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_camera.c index 2d65397..fb9365d 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_camera.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_camera.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #include "zf_common_debug.h" @@ -44,9 +45,9 @@ #include "zf_device_camera.h" -fifo_struct camera_receiver_fifo; -uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; -uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; +fifo_struct camera_receiver_fifo; // 定义摄像头接收数据fifo结构体 +uint8 camera_receiver_buffer[CAMERA_RECEIVER_BUFFER_SIZE]; // 定义摄像头接收数据缓冲区 +uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // 定义摄像头数据发送到上位机的帧头 //------------------------------------------------------------------------------------------------------------------- // @brief 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 @@ -54,13 +55,14 @@ uint8 camera_send_image_frame_header[4] = {0x00, 0xFF, 0x01, 0x01}; // @param *data2 存放解压数据的地址 // @param image_size 图像的大小 // @return void -// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); +// Sample usage: camera_binary_image_decompression(&ov7725_image_binary[0][0], &data_buffer[0][0], OV7725_SIZE); //------------------------------------------------------------------------------------------------------------------- void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size) { + zf_assert(NULL != data1); + zf_assert(NULL != data2); uint8 i = 8; - zf_assert(data1 != NULL); - zf_assert(data2 != NULL); + while(image_size --) { i = 8; @@ -82,7 +84,7 @@ void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 //------------------------------------------------------------------------------------------------------------------- void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); // 发送命令 uart_write_buffer(uartn, camera_send_image_frame_header, 4); @@ -104,7 +106,7 @@ void camera_fifo_init (void) //------------------------------------------------------------------------------------------------------------------- -// @brief 摄像头初始化 +// @brief 摄像头采集初始化 // @param image_size 图像的大小 // @return void // @param image_size 图像的大小 @@ -160,7 +162,7 @@ uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_siz EXTI_TRIGGER_RISING, image_size); // 如果超频到300M 倒数第二个参数请设置为FALLING - exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 + exti_init(SCC8660_VSYNC_PIN, EXTI_TRIGGER_FALLING); // 初始化场中断,并设置为下降沿触发中断 break; default: break; diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_camera.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_camera.h index b35f7bb..826bb03 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_camera.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_camera.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-25 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_camera_h_ @@ -41,15 +42,17 @@ #include "zf_driver_uart.h" #include "zf_device_type.h" -#define CAMERA_RECEIVER_BUFFER_SIZE (8) +//=================================================摄像头公共库 基本配置================================================ +#define CAMERA_RECEIVER_BUFFER_SIZE (8) // 定义摄像头接收数据缓冲区大小 +extern fifo_struct camera_receiver_fifo; // 声明摄像头接收数据fifo结构体 +extern uint8 camera_send_image_frame_header[4]; // 声明摄像头数据发送到上位机的帧头 +//=================================================摄像头公共库 基本配置================================================ -extern fifo_struct camera_receiver_fifo; - -//================================================摄像头公共库 基础函数==================================================== -void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); -void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); -void camera_fifo_init (void); -uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); -//================================================摄像头公共库 基础函数==================================================== +//=================================================摄像头公共库 基础函数================================================ +void camera_binary_image_decompression (const uint8 *data1, uint8 *data2, uint32 image_size); // 摄像头二进制图像数据解压为十六进制八位数据 小钻风用 +void camera_send_image (uart_index_enum uartn, const uint8 *image_addr, uint32 image_size); // 摄像头图像发送至上位机查看图像 +void camera_fifo_init (void); // 摄像头串口 FIFO 初始化 +uint8 camera_init (uint8 *source_addr, uint8 *destination_addr, uint16 image_size); // 摄像头采集初始化 +//=================================================摄像头公共库 基础函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_dl1a.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_dl1a.c index e5477ed..9c00e9a 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_dl1a.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_dl1a.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -45,24 +46,22 @@ #include "zf_common_debug.h" #include "zf_driver_delay.h" +#include "zf_driver_exti.h" #include "zf_driver_soft_iic.h" #include "zf_device_dl1a.h" -uint8 dl1a_finsh_flag; -uint16 dl1a_distance_mm; +uint8 dl1a_finsh_flag = 0; // 定义采集完成标志位 +uint16 dl1a_distance_mm = 8192; // 定义距离数据存放变量 #if DL1A_USE_SOFT_IIC -static soft_iic_info_struct dl1a_iic_struct; +static soft_iic_info_struct dl1a_iic_struct; // 定义软件IIC结构体 #define dl1a_write_array(data, len) (soft_iic_write_8bit_array(&dl1a_iic_struct, (data), (len))) #define dl1a_write_register(reg, data) (soft_iic_write_8bit_register(&dl1a_iic_struct, (reg), (data))) #define dl1a_read_register(reg) (soft_iic_read_8bit_register(&dl1a_iic_struct, (reg))) #define dl1a_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&dl1a_iic_struct, (reg), (data), (len))) #else -#define dl1a_write_array(data, len) (iic_write_8bit_array(DL1A_IIC, DL1A_DEV_ADDR, (data), (len))) -#define dl1a_write_register(reg, data) (iic_write_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data))) -#define dl1a_read_register(reg) (iic_read_8bit_register(DL1A_IIC, DL1A_DEV_ADDR, (reg))) -#define dl1a_read_registers(reg, data, len) (iic_read_8bit_registers(DL1A_IIC, DL1A_DEV_ADDR, (reg), (data), (len))) +#error "暂不支持硬件IIC通讯" #endif // 这个速率表示从目标反射并被设备检测到的信号的振幅 @@ -112,11 +111,11 @@ static uint8 dl1a_get_spad_info (uint8 *index, uint8 *type_is_aperture) dl1a_write_register(0x83, 0x00); tmp = 0x00; - while(tmp == 0x00 || tmp == 0xFF) + while(0x00 == tmp || 0xFF == tmp) { system_delay_ms(1); dl1a_read_registers(0x83, &tmp, 1); - if(loop_count++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -204,11 +203,11 @@ static uint16 dl1a_encode_timeout (uint16 timeout_mclks) uint16 ms_byte = 0; uint16 return_data = 0; - if (timeout_mclks > 0) + if(0 < timeout_mclks) { // 格式: (LSByte * 2 ^ MSByte) + 1 ls_byte = timeout_mclks - 1; - while ((ls_byte & 0xFFFFFF00) > 0) + while(0 < (ls_byte & 0xFFFFFF00)) { ls_byte >>= 1; ms_byte++; @@ -247,12 +246,12 @@ static void dl1a_get_sequence_step_enables(dl1a_sequence_enables_step_struct *en static uint8 dl1a_get_vcsel_pulse_period (dl1a_vcsel_period_type_enum type) { uint8 data_buffer = 0; - if (type == DL1A_VCSEL_PERIOD_PER_RANGE) + if(DL1A_VCSEL_PERIOD_PER_RANGE == type) { dl1a_read_registers(DL1A_PRE_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); } - else if (type == DL1A_VCSEL_PERIOD_FINAL_RANGE) + else if(DL1A_VCSEL_PERIOD_FINAL_RANGE == type) { dl1a_read_registers(DL1A_FINAL_RANGE_CONFIG_VCSEL_PERIOD, &data_buffer, 1); data_buffer = decode_vcsel_period(data_buffer); @@ -294,7 +293,7 @@ static void dl1a_get_sequence_step_timeouts (dl1a_sequence_enables_step_struct c reg16_buffer = ((uint16) reg_buffer[0] << 8) | reg_buffer[1]; timeouts->final_range_mclks = dl1a_decode_timeout(reg16_buffer); - if (enables->pre_range) + if(enables->pre_range) { timeouts->final_range_mclks -= timeouts->pre_range_mclks; } @@ -318,11 +317,11 @@ static uint8 dl1a_perform_single_ref_calibration (uint8 vhv_init_byte) { dl1a_write_register(DL1A_SYSRANGE_START, 0x01 | vhv_init_byte); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - while ((data_buffer & 0x07) == 0) + while(0 == (data_buffer & 0x07)) { system_delay_ms(1); dl1a_read_registers(DL1A_MSRC_CONFIG_TIMEOUT_MACROP, &data_buffer, 1); - if (loop_count ++ > DL1A_TIMEOUT_COUNT) + if(DL1A_TIMEOUT_COUNT < loop_count ++) { return_state = 1; break; @@ -361,7 +360,7 @@ static uint8 dl1a_set_measurement_timing_budget (uint32 budget_us) do { - if (budget_us < DL1A_MIN_TIMING_BUDGET) + if(DL1A_MIN_TIMING_BUDGET > budget_us) { return_state = 1; break; @@ -524,6 +523,20 @@ void dl1a_get_distance (void) } } +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 DL1A INT 中断响应处理函数 +// 参数说明 void +// 返回参数 void +// 使用示例 dl1a_int_handler(); +// 备注信息 本函数需要在 DL1A_INT_PIN 对应的外部中断处理函数中调用 +//------------------------------------------------------------------------------------------------------------------- +void dl1a_int_handler (void) +{ +#if DL1A_INT_ENABLE + dl1a_get_distance(); +#endif +} + //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 DL1A // 参数说明 void @@ -534,11 +547,12 @@ void dl1a_get_distance (void) uint8 dl1a_init (void) { uint32 measurement_timing_budget_us; - uint8 stop_variable; + uint8 stop_variable = 0; uint8 return_state = 0; - uint8 reg_data_buffer ; + uint8 reg_data_buffer = 0; uint8 ref_spad_map[6]; uint8 data_buffer[7]; + uint8 i = 0; memset(ref_spad_map, 0, 6); memset(data_buffer, 0, 7); @@ -548,14 +562,14 @@ uint8 dl1a_init (void) #else iic_init(DL1A_IIC, DL1A_DEV_ADDR, DL1A_IIC_SPEED, DL1A_SCL_PIN, DL1A_SDA_PIN); #endif - gpio_init(DL1A_XSHUT_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(DL1A_XS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); do { system_delay_ms(100); - gpio_low(DL1A_XSHUT_PIN); + gpio_low(DL1A_XS_PIN); system_delay_ms(50); - gpio_high(DL1A_XSHUT_PIN); + gpio_high(DL1A_XS_PIN); system_delay_ms(100); // -------------------------------- DL1A 启动初始化 -------------------------------- @@ -583,7 +597,7 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 启动初始化 -------------------------------- // -------------------------------- DL1A 配置初始化 -------------------------------- - if (dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) + if(dl1a_get_spad_info(&data_buffer[0], &data_buffer[1])) { return_state = 1; zf_log(0, "DL1A self check error."); @@ -600,25 +614,25 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_GLOBAL_CONFIG_REF_EN_START_SELECT, 0xB4); data_buffer[2] = data_buffer[1] ? 12 : 0; // 12 is the first aperture spad - for (uint8 i = 0; i < 48; i++) + for(i = 0; 48 > i; i ++) { - if (i < data_buffer[2] || data_buffer[3] == data_buffer[0]) + if(i < data_buffer[2] || data_buffer[3] == data_buffer[0]) { // 此位低于应启用的第一个位 // 或者 (eference_spad_count) 位已启用 // 因此此位为零 ref_spad_map[i / 8] &= ~(1 << (i % 8)); } - else if ((ref_spad_map[i / 8] >> (i % 8)) & 0x1) + else if((ref_spad_map[i / 8] >> (i % 8)) & 0x1) { - data_buffer[3]++; + data_buffer[3] ++; } } data_buffer[0] = DL1A_GLOBAL_CONFIG_SPAD_ENABLES_REF_0; - for(uint8 i = 1; i < 7; i++) + for(i = 1; 7 > i; i ++) { - data_buffer[1] = ref_spad_map[i-1]; + data_buffer[1] = ref_spad_map[i - 1]; } dl1a_write_array(data_buffer, 7); @@ -720,14 +734,14 @@ uint8 dl1a_init (void) // -------------------------------- DL1A 配置初始化 -------------------------------- dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x01); - if (dl1a_perform_single_ref_calibration(0x40)) + if(dl1a_perform_single_ref_calibration(0x40)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); break; } dl1a_write_register(DL1A_SYSTEM_SEQUENCE_CONFIG, 0x02); - if (dl1a_perform_single_ref_calibration(0x00)) + if(dl1a_perform_single_ref_calibration(0x00)) { return_state = 1; zf_log(0, "DL1A perform single reference calibration error."); @@ -748,5 +762,10 @@ uint8 dl1a_init (void) dl1a_write_register(DL1A_SYSRANGE_START, 0x02); }while(0); +#if DL1A_INT_ENABLE + exti_init(DL1A_INT_PIN, EXTI_TRIGGER_FALLING); + dl1a_int_handler(); + dl1a_finsh_flag = 0; +#endif return return_state; } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_dl1a.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_dl1a.h index bc834bb..5d9ea10 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_dl1a.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_dl1a.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -54,21 +55,39 @@ // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 // 需要注意的是 DL1A 最高支持 400KHz 的 IIC 通信速率 -#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 -#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//=================================================定义 DL1A测距模块 基本配置================================================ +#define DL1A_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 +#if DL1A_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 -#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 +#define DL1A_SOFT_IIC_DELAY (100) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define DL1A_SCL_PIN (P33_4) // 软件 IIC SCL 引脚 连接 VL53L0X 的 SCL 引脚 +#define DL1A_SDA_PIN (P33_5) // 软件 IIC SDA 引脚 连接 VL53L0X 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else #error "暂不支持硬件IIC通讯" #endif -#define DL1A_XSHUT_PIN (P20_10) -#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 +#define DL1A_XS_PIN (P20_10) +#define DL1A_INT_ENABLE ( 1 ) // 是否启用 INT 引脚 启用则会自动更新数据 +#if DL1A_INT_ENABLE +#define DL1A_INT_PIN (ERU_CH1_REQ10_P14_3) +#endif +#define DL1A_TIMEOUT_COUNT (0x00FF) // VL53L0X 超时计数 -//================================================定义 DL1A 内部地址================================================ +#define DL1A_MIN_TIMING_BUDGET (20000) + +#define DL1A_GET_START_OVERHEAD (1910) +#define DL1A_SET_START_OVERHEAD (1320) +#define DL1A_END_OVERHEAD (960 ) +#define DL1A_TCC_OVERHEAD (590 ) +#define DL1A_DSS_OVERHEAD (690 ) +#define DL1A_MSRC_OVERHEAD (660 ) +#define DL1A_PRERANGE_OVERHEAD (660 ) +#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//=================================================定义 DL1A测距模块 基本配置================================================ + + +//=================================================定义 DL1A测距模块 内部地址================================================ #define DL1A_DEV_ADDR (0x52 >> 1) // 0b0101001 #define DL1A_SYSRANGE_START (0x00) @@ -146,20 +165,10 @@ #define DL1A_OSC_CALIBRATE_VAL (0xF8) #define DL1A_IO_VOLTAGE_CONFIG (0x89) // IO 电压设置寄存器地址 默认 1V8 使用修改为 2V8 +//=================================================定义 DL1A测距模块 内部地址================================================ -//================================================定义 DL1A 内部地址================================================ - -#define DL1A_MIN_TIMING_BUDGET (20000) - -#define DL1A_GET_START_OVERHEAD (1910) -#define DL1A_SET_START_OVERHEAD (1320) -#define DL1A_END_OVERHEAD (960 ) -#define DL1A_TCC_OVERHEAD (590 ) -#define DL1A_DSS_OVERHEAD (690 ) -#define DL1A_MSRC_OVERHEAD (660 ) -#define DL1A_PRERANGE_OVERHEAD (660 ) -#define DL1A_FINALlRANGE_OVERHEAD (550 ) +//================================================定义 DL1A测距模块 参数结构体================================================ typedef enum { DL1A_VCSEL_PERIOD_PER_RANGE, @@ -187,13 +196,20 @@ typedef struct uint32 pre_range_us; uint32 final_range_us; }dl1a_sequence_timeout_step_struct; +//================================================定义 DL1A测距模块 参数结构体================================================ -extern uint8 dl1a_finsh_flag; -extern uint16 dl1a_distance_mm; -void dl1a_get_distance (void); +//=================================================声明 DL1A测距模块 全局变量================================================ +extern uint8 dl1a_finsh_flag; // 声明采集完成标志位 +extern uint16 dl1a_distance_mm; // 声明距离数据存放变量 +//=================================================声明 DL1A测距模块 全局变量================================================ -uint8 dl1a_init (void); + +//=================================================声明 DL1A测距模块 基础函数================================================ +void dl1a_get_distance (void); // 返回以毫米为单位的范围读数 +void dl1a_int_handler (void); // DL1A INT 中断响应处理函数 +uint8 dl1a_init (void); // 初始化 DL1A +//=================================================声明 DL1A测距模块 基础函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_gps_tau1201.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_gps_tau1201.c index 7b8a88e..d1517d7 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_gps_tau1201.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_gps_tau1201.c @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -63,8 +64,8 @@ static uint8 gps_tau1201_receiver_buffer[GPS_TAU1201_BUFFER_SIZE] gps_state_enum gps_gga_state = GPS_STATE_RECEIVING; // gga 语句状态 gps_state_enum gps_rmc_state = GPS_STATE_RECEIVING; // rmc 语句状态 -static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; -static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; +static uint8 gps_gga_buffer[GPS_TAU1201_BUFFER_SIZE]; // GGA语句缓冲区 +static uint8 gps_rmc_buffer[GPS_TAU1201_BUFFER_SIZE]; // RMC语句缓冲区 //------------------------------------------------------------------------------------------------------------------- // 函数简介 获取指定 ',' 后面的索引 @@ -488,7 +489,7 @@ void gps_uart_callback (void) // 使用示例 gps_init(); // 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint8 gps_init (void) +void gps_init (void) { const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED}; const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10}; @@ -537,6 +538,4 @@ uint8 gps_init (void) gps_tau1201_state = 1; uart_rx_interrupt(GPS_TAU1201_UART, 1); - - return 0; } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_gps_tau1201.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_gps_tau1201.h index 0416e14..413700f 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_gps_tau1201.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_gps_tau1201.h @@ -30,7 +30,8 @@ * * 修改记录 * 日期 作者 备注 -* 2022-09-15 pudding first version +* 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -48,46 +49,47 @@ #include "zf_common_typedef.h" -//===============================================GPS 驱动配置==================================================== +//=================================================定义 定位模块 基本配置================================================ #define GPS_TAU1201_UART (UART_3) #define GPS_TAU1201_RX (UART3_TX_P15_6) // GPS RX引脚连接到单片机此 #define GPS_TAU1201_TX (UART3_RX_P15_7) // GPS TX串口引脚 -//===============================================GPS 驱动配置==================================================== -#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 -#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 -#define PI (3.1415926535898) +#define ANGLE_TO_RAD(x) ((x) * PI / 180.0) // 角度转换为弧度 +#define RAD_TO_ANGLE(x) ((x) * 180.0 / PI) // 弧度转换为角度 +#define PI (3.1415926535898) +//=================================================定义 定位模块 基本配置================================================ -//=============================================定义 GPS 数据结构体================================================== + +//================================================定义 定位模块 参数结构体================================================ typedef struct { - uint16 year; - uint8 month; - uint8 day; - uint8 hour; - uint8 minute; - uint8 second; + uint16 year; + uint8 month; + uint8 day; + uint8 hour; + uint8 minute; + uint8 second; }gps_time_struct; typedef struct { - gps_time_struct time; // 时间- - uint8 state; // 有效状态 1:定位有效 0:定位无效 - uint16 latitude_degree; // 度 - uint16 latitude_cent; // 分 - uint16 latitude_second; // 秒 - uint16 longitude_degree; // 度 - uint16 longitude_cent; // 分 - uint16 longitude_second; // 秒 - double latitude; // 纬度 - double longitude; // 经度 - int8 ns; // 纬度半球 N(北半球)或 S(南半球) - int8 ew; // 经度半球 E(东经)或 W(西经) - float speed; // 速度(公里/每小时) - float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) + gps_time_struct time; // 时间- + uint8 state; // 有效状态 1:定位有效 0:定位无效 + uint16 latitude_degree; // 度 + uint16 latitude_cent; // 分 + uint16 latitude_second; // 秒 + uint16 longitude_degree; // 度 + uint16 longitude_cent; // 分 + uint16 longitude_second; // 秒 + double latitude; // 纬度 + double longitude; // 经度 + int8 ns; // 纬度半球 N(北半球)或 S(南半球) + int8 ew; // 经度半球 E(东经)或 W(西经) + float speed; // 速度(公里/每小时) + float direction; // 地面航向(000.0~359.9 度,以真北方为参考基准) // 下面两个个信息从GNGGA语句中获取 - uint8 satellite_used; // 用于定位的卫星数量 - float height; // 高度 + uint8 satellite_used; // 用于定位的卫星数量 + float height; // 高度 }gps_info_struct; typedef enum @@ -96,21 +98,20 @@ typedef enum GPS_STATE_RECEIVED, // 数据接收完成 GPS_STATE_PARSING, // 正在解析 }gps_state_enum; -//=============================================定义 GPS 数据结构体================================================== +//================================================定义 定位模块 参数结构体================================================ -//==============================================声明 GPS 数据变量=================================================== -extern gps_info_struct gps_tau1201; -extern uint8 gps_tau1201_flag; -//==============================================声明 GPS 数据变量=================================================== -//================================================GPS 基础函数==================================================== +//=================================================声明 定位模块 全局变量================================================ +extern gps_info_struct gps_tau1201; // GPS解析之后的数据 +extern uint8 gps_tau1201_flag; // 1:采集完成等待处理数据 0:没有采集完成 +//=================================================声明 定位模块 全局变量================================================ + + +//=================================================声明 定位模块 基础函数================================================ double get_two_points_distance (double lat1, double lng1, double lat2, double lng2); // 计算从第一个点到第二个点的距离(单位:m) double get_two_points_azimuth (double lat1, double lon1, double lat2, double lon2); // 计算从第一个点到第二个点的方位角(单位:°) - uint8 gps_data_parse (void); // 解析GPS数据 void gps_uart_callback (void); // GPS回调函数 - -uint8 gps_init (void); // GPS初始化 -//================================================GPS 基础函数==================================================== - +void gps_init (void); // GPS初始化 +//=================================================声明 定位模块 基础函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_icm20602.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_icm20602.c index 77233d4..b13125b 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_icm20602.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_icm20602.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,9 @@ #include "zf_driver_soft_iic.h" #include "zf_device_icm20602.h" -int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) +int16 icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +float icm20602_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if ICM20602_USE_SOFT_IIC static soft_iic_info_struct icm20602_iic_struct; @@ -159,7 +161,7 @@ static uint8 icm20602_self_check (void) while(0x12 != dat) // 判断 ID 是否正确 { - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -204,49 +206,6 @@ void icm20602_get_gyro (void) icm20602_gyro_z = (int16)(((uint16)dat[4] << 8 | dat[5])); } - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = icm20602_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(ICM20602_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x08: acc_data = (float)acc_value / 8192; break; // 0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x10: acc_data = (float)acc_value / 4096; break; // 0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x18: acc_data = (float)acc_value / 2048; break; // 0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = icm20602_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float icm20602_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(ICM20602_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s - case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 ICM20602 // 参数说明 void @@ -286,7 +245,7 @@ uint8 icm20602_init (void) do { // 等待复位成功 val = icm20602_read_register(ICM20602_PWR_MGMT_1); - if(timeout_count ++ > ICM20602_TIMEOUT_COUNT) + if(ICM20602_TIMEOUT_COUNT < timeout_count ++) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 ICM20602 自检出错并超时退出了 @@ -305,20 +264,84 @@ uint8 icm20602_init (void) icm20602_write_register(ICM20602_PWR_MGMT_2, 0x00); // 开启陀螺仪和加速度计 icm20602_write_register(ICM20602_CONFIG, 0x01); // 176HZ 1KHZ icm20602_write_register(ICM20602_SMPLRT_DIV, 0x07); // 采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV) - icm20602_write_register(ICM20602_GYRO_CONFIG, ICM20602_GYR_SAMPLE); // ±2000 dps - icm20602_write_register(ICM20602_ACCEL_CONFIG, ICM20602_ACC_SAMPLE); // ±8g - icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples - // ICM20602_GYR_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // ICM20602_ACCEL_CONFIG寄存器 - // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + // ICM20602_ACCEL_CONFIG 寄存器 + // 设置为 0x00 加速度计量程为 ±2 g 获取到的加速度计数据除以 16384 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x08 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x10 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x18 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(ICM20602_ACC_SAMPLE_DEFAULT) + { + case ICM20602_ACC_SAMPLE_SGN_2G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x00); + icm20602_transition_factor[0] = 16384; + }break; + case ICM20602_ACC_SAMPLE_SGN_4G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x08); + icm20602_transition_factor[0] = 8192; + }break; + case ICM20602_ACC_SAMPLE_SGN_8G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10); + icm20602_transition_factor[0] = 4096; + }break; + case ICM20602_ACC_SAMPLE_SGN_16G: + { + icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x18); + icm20602_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "ICM20602_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + // ICM20602_GYRO_CONFIG 寄存器 + // 设置为 0x00 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x08 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x10 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x18 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s + switch(ICM20602_GYRO_SAMPLE_DEFAULT) + { + case ICM20602_GYRO_SAMPLE_SGN_250DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x00); + icm20602_transition_factor[1] = 131.0; + }break; + case ICM20602_GYRO_SAMPLE_SGN_500DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x08); + icm20602_transition_factor[1] = 65.5; + }break; + case ICM20602_GYRO_SAMPLE_SGN_1000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x10); + icm20602_transition_factor[1] = 32.8; + }break; + case ICM20602_GYRO_SAMPLE_SGN_2000DPS: + { + icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18); + icm20602_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "ICM20602_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } + + icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); // Average 4 samples 44.8HZ //0x23 Average 16 samples }while(0); return return_state; } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_icm20602.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_icm20602.h index 66fb233..261a244 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_icm20602.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_icm20602.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -58,6 +59,8 @@ #include "zf_common_typedef.h" +//================================================定义 ICM20602 基本配置================================================ +// ICM20602_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 #define ICM20602_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if ICM20602_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -66,7 +69,6 @@ #define ICM20602_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 ICM20602 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== #define ICM20602_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define ICM20602_SPI (SPI_0) // 硬件 SPI 号 @@ -78,7 +80,27 @@ #define ICM20602_CS_PIN (P20_13) // CS 片选引脚 #define ICM20602_CS(x) ((x) ? (gpio_high(ICM20602_CS_PIN)) : (gpio_low(ICM20602_CS_PIN))) +typedef enum +{ + ICM20602_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + ICM20602_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}icm20602_acc_sample_config; + +typedef enum +{ + ICM20602_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + ICM20602_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}icm20602_gyro_sample_config; + +#define ICM20602_ACC_SAMPLE_DEFAULT ( ICM20602_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define ICM20602_GYRO_SAMPLE_DEFAULT ( ICM20602_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define ICM20602_TIMEOUT_COUNT (0x00FF) // ICM20602 超时计数 +//================================================定义 ICM20602 基本配置================================================ + //================================================定义 ICM20602 内部地址================================================ #define ICM20602_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 @@ -162,21 +184,43 @@ // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - //================================================定义 ICM20602 内部地址================================================ -//===============================================声明 ICM20602 数据存储变量============================================== -extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 -extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 -//===============================================声明 ICM20602 数据存储变量============================================== -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 全局变量================================================ +extern int16 icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 icm20602_acc_x, icm20602_acc_y, icm20602_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float icm20602_transition_factor[2]; // 转换实际值的比例 +//================================================声明 ICM20602 全局变量================================================ + + +//================================================声明 ICM20602 基础函数================================================ void icm20602_get_acc (void); // 获取 ICM20602 加速度计数据 -void icm20602_get_gyro (void); // 获取ICM20602陀螺仪数据 -float icm20602_gyro_transition (int16 gyro_value); // 将 ICM20602 陀螺仪数据转换为实际物理数据 -float icm20602_acc_transition (int16 acc_value); // 将 ICM20602 加速度计数据转换为实际物理数据 +void icm20602_get_gyro (void); // 获取 ICM20602 陀螺仪数据 uint8 icm20602_init (void); // 初始化 ICM20602 -//==================================================ICM20602 基础函数================================================== +//================================================声明 ICM20602 基础函数================================================ + + +//================================================声明 ICM20602 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = icm20602_acc_transition(icm20602_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_acc_transition(acc_value) ((float)acc_value / icm20602_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 ICM20602 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = icm20602_gyro_transition(icm20602_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define icm20602_gyro_transition(gyro_value) ((float)gyro_value / icm20602_transition_factor[1]) +//================================================声明 ICM20602 拓展函数================================================ + #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu660ra.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu660ra.c index b99079f..169d093 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu660ra.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu660ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -55,15 +56,17 @@ ********************************************************************************************************************/ #include "zf_common_debug.h" +#include "zf_device_config.h" #include "zf_driver_delay.h" -#include "zf_driver_spi.h" #include "zf_driver_gpio.h" #include "zf_driver_soft_iic.h" -#include "zf_device_config.h" +#include "zf_driver_spi.h" + #include "zf_device_imu660ra.h" -int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +float imu660ra_transition_factor[2] = {4096, 16.4}; // 转换实际值的比例 #if IMU660RA_USE_SOFT_IIC static soft_iic_info_struct imu660ra_iic_struct; @@ -130,7 +133,7 @@ static uint8 imu660ra_read_register(uint8 reg) //------------------------------------------------------------------------------------------------------------------- static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len) { - uint8 temp_data[7]; + uint8 temp_data[8]; IMU660RA_CS(0); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); IMU660RA_CS(1); @@ -154,7 +157,7 @@ static uint8 imu660ra_self_check (void) uint16 timeout_count = 0; do { - if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT) + if(IMU660RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -200,49 +203,6 @@ void imu660ra_get_gyro (void) imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU660RA_ACC_SAMPLE) - { - case 0x00: acc_data = (float)acc_value / 16384; break; // 0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x01: acc_data = (float)acc_value / 8192; break; // 0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x02: acc_data = (float)acc_value / 4096; break; // 0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x03: acc_data = (float)acc_value / 2048; break; // 0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu660ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU660RA_GYR_SAMPLE) - { - case 0x00: gyro_data = (float)gyro_value / 16.4f; break; // 0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - case 0x01: gyro_data = (float)gyro_value / 32.8f; break; // 0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - case 0x02: gyro_data = (float)gyro_value / 65.6f; break; // 0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - case 0x03: gyro_data = (float)gyro_value / 131.2f; break; // 0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - case 0x04: gyro_data = (float)gyro_value / 262.4f; break; // 0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU660RA // 参数说明 void @@ -277,7 +237,7 @@ uint8 imu660ra_init (void) imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 system_delay_ms(20); - if(imu660ra_read_register(IMU660RA_INT_STA) == 0) // 检查是否配置完成 + if(0 == imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么就是 imu660ra 配置初始化文件出错了 @@ -286,41 +246,90 @@ uint8 imu660ra_init (void) return_state = 1; break; } - imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 - - imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 - // IMU660RA_ACC_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 加速度采样率为:25HZ - // 设置为:0x7 加速度采样率为:50HZ --- 底层默认 - // 设置为:0x8 加速度采样率为:100HZ - // 设置为:0x9 加速度采样率为:200HZ - // 设置为:0xA 加速度采样率为:400HZ - // 设置为:0xB 加速度采样率为:800HZ - // 设置为:0xC 加速度采样率为:1600HZ - imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz采样频率 - // IMU660RA_GYR_CONF 寄存器 低四位 采用率越低数据越平滑,实时性越差,类似于硬件滤波 - // 设置为:0x6 陀螺仪采样率为:25HZ - // 设置为:0x7 陀螺仪采样率为:50HZ - // 设置为:0x8 陀螺仪采样率为:100HZ - // 设置为:0x9 陀螺仪采样率为:200HZ --- 底层默认 - // 设置为:0xA 陀螺仪采样率为:400HZ - // 设置为:0xB 陀螺仪采样率为:800HZ - // 设置为:0xC 陀螺仪采样率为:1600HZ - imu660ra_write_register(IMU660RA_ACC_RANGE, IMU660RA_ACC_SAMPLE); // 加速度量程配置 配置量程为:±8g - imu660ra_write_register(IMU660RA_GYR_RANGE, IMU660RA_GYR_SAMPLE); // 陀螺仪量程配置 配置量程为:±2000dps + imu660ra_write_register(IMU660RA_PWR_CTRL, 0x0E); // 开启性能模式 使能陀螺仪、加速度、温度传感器 + imu660ra_write_register(IMU660RA_ACC_CONF, 0xA7); // 加速度采集配置 性能模式 正常采集 50Hz 采样频率 + imu660ra_write_register(IMU660RA_GYR_CONF, 0xA9); // 陀螺仪采集配置 性能模式 正常采集 200Hz 采样频率 // IMU660RA_GYR_SAMPLE寄存器 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据除以262.4 可以转化为带物理单位的数据,单位为:°/s + switch(IMU660RA_ACC_SAMPLE_DEFAULT) + { + case IMU660RA_ACC_SAMPLE_SGN_2G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); + imu660ra_transition_factor[0] = 16384; + }break; + case IMU660RA_ACC_SAMPLE_SGN_4G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); + imu660ra_transition_factor[0] = 8192; + }break; + case IMU660RA_ACC_SAMPLE_SGN_8G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); + imu660ra_transition_factor[0] = 4096; + }break; + case IMU660RA_ACC_SAMPLE_SGN_16G: + { + imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); + imu660ra_transition_factor[0] = 2048; + }break; + default: + { + zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } // IMU660RA_ACC_SAMPLE寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) + switch(IMU660RA_GYRO_SAMPLE_DEFAULT) + { + case IMU660RA_GYRO_SAMPLE_SGN_125DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); + imu660ra_transition_factor[1] = 262.4; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_250DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); + imu660ra_transition_factor[1] = 131.2; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_500DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); + imu660ra_transition_factor[1] = 65.6; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); + imu660ra_transition_factor[1] = 32.8; + }break; + case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); + imu660ra_transition_factor[1] = 16.4; + }break; + default: + { + zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + } + if(1 == return_state) + { + break; + } }while(0); return return_state; } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu660ra.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu660ra.h index 498a6cf..4583819 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu660ra.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu660ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -59,32 +60,52 @@ #include "zf_common_typedef.h" - +//================================================定义 IMU660RA 基本配置================================================ // IMU660RA_USE_SOFT_IIC定义为0表示使用硬件SPI驱动 定义为1表示使用软件IIC驱动 // 当更改IMU660RA_USE_SOFT_IIC定义后,需要先编译并下载程序,单片机与模块需要断电重启才能正常通讯 -#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 -#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 +#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== -#define IMU660RA_SOFT_IIC_DELAY (59 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 -#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 -#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 +#define IMU660RA_SOFT_IIC_DELAY (59) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +#define IMU660RA_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 +#define IMU660RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else - //====================================================硬件 SPI 驱动==================================================== -#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 -#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 -#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 -#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 -#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 +#define IMU660RA_SPI (SPI_0) // 硬件 SPI 号 +#define IMU660RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU660RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU660RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 //====================================================硬件 SPI 驱动==================================================== #endif -#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 +#define IMU660RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) -#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +typedef enum +{ + IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu660ra_acc_sample_config; + +typedef enum +{ + IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu660ra_gyro_sample_config; + +#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660 超时计数 +//================================================定义 IMU660RA 基本配置================================================ + //================================================定义 IMU660RA 内部地址================================================ -#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 +#define IMU660RA_DEV_ADDR (0x69) // SA0接地:0x68 SA0上拉:0x69 模块默认上拉 #define IMU660RA_SPI_W (0x00) #define IMU660RA_SPI_R (0x80) @@ -100,32 +121,53 @@ #define IMU660RA_ACC_RANGE (0x41) #define IMU660RA_GYR_CONF (0x42) #define IMU660RA_GYR_RANGE (0x43) -#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 +#define IMU660RA_ACC_SAMPLE (0x02) // 加速度计量程 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以 16384 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x01 加速度计量程为:±4g 获取到的加速度计数据 除以 8192 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x02 加速度计量程为:±8g 获取到的加速度计数据 除以 4096 可以转化为带物理单位的数据 单位:g(m/s^2) // 设置为:0x03 加速度计量程为:±16g 获取到的加速度计数据 除以 2048 可以转化为带物理单位的数据 单位:g(m/s^2) -#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 +#define IMU660RA_GYR_SAMPLE (0x00) // 陀螺仪量程 // 设置为:0x00 陀螺仪量程为:±2000dps 获取到的陀螺仪数据 除以 16.4 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x01 陀螺仪量程为:±1000dps 获取到的陀螺仪数据 除以 32.8 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x02 陀螺仪量程为:±500 dps 获取到的陀螺仪数据 除以 65.6 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x03 陀螺仪量程为:±250 dps 获取到的陀螺仪数据 除以 131.2 可以转化为带物理单位的数据 单位为:°/s // 设置为:0x04 陀螺仪量程为:±125 dps 获取到的陀螺仪数据 除以 262.4 可以转化为带物理单位的数据 单位为:°/s - //================================================定义 IMU660RA 内部地址================================================ -//===============================================声明 IMU660RA 数据存储变量=============================================== -extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//===============================================声明 IMU660RA 数据存储变量=============================================== -//==================================================IMU660RA 基础函数================================================== -void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 -void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 -float imu660ra_acc_transition (int16 acc_value); // 将 IMU660RA 加速度计数据转换为实际物理数据 -float imu660ra_gyro_transition (int16 gyro_value); // 将 IMU660RA 陀螺仪数据转换为实际物理数据 -uint8 imu660ra_init (void); // 初始化 IMU660RA -//==================================================IMU660RA 基础函数=================================================== +//================================================声明 IMU660RA 全局变量================================================ +extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern float imu660ra_transition_factor[2]; // 转换实际值的比例 +//================================================声明 IMU660RA 全局变量================================================ + + +//================================================声明 IMU660RA 基础函数================================================ +void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 +void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 +uint8 imu660ra_init (void); // 初始化 IMU660RA +//================================================声明 IMU660RA 基础函数================================================ + + +//================================================声明 IMU660RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu660ra_acc_transition(imu660ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_acc_transition(acc_value) ((float)acc_value / imu660ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU660RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu660ra_gyro_transition(imu660ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu660ra_gyro_transition(gyro_value) ((float)gyro_value / imu660ra_transition_factor[1]) +//================================================声明 IMU660RA 拓展函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu963ra.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu963ra.c index ef770d9..d8b9c4b 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu963ra.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu963ra.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -60,9 +61,10 @@ #include "zf_driver_soft_iic.h" #include "zf_device_imu963ra.h" -int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; -int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; -int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; +int16 imu963ra_gyro_x = 0, imu963ra_gyro_y = 0, imu963ra_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 imu963ra_acc_x = 0, imu963ra_acc_y = 0, imu963ra_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) +int16 imu963ra_mag_x = 0, imu963ra_mag_y = 0, imu963ra_mag_z = 0; // 三轴磁力计数据 MAG (magnetometer 磁力计) +float imu963ra_transition_factor[3] = {4098, 14.3, 3000}; // 转换实际值的比例 #if IMU963RA_USE_SOFT_IIC static soft_iic_info_struct imu963ra_iic_struct; @@ -105,7 +107,7 @@ static soft_iic_info_struct imu963ra_iic_struct; // 使用示例 imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +static void imu963ra_write_acc_gyro_register (uint8 reg, uint8 data) { IMU963RA_CS(0); spi_write_8bit_register(IMU963RA_SPI, reg | IMU963RA_SPI_W, data); @@ -120,7 +122,7 @@ static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) // 使用示例 imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +static uint8 imu963ra_read_acc_gyro_register (uint8 reg) { uint8 data = 0; IMU963RA_CS(0); @@ -139,7 +141,7 @@ static uint8 imu963ra_read_acc_gyro_register(uint8 reg) // 使用示例 imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, dat, 6); // 备注信息 内部调用 //------------------------------------------------------------------------------------------------------------------- -static void imu963ra_read_acc_gyro_registers(uint8 reg, uint8 *data, uint32 len) +static void imu963ra_read_acc_gyro_registers (uint8 reg, uint8 *data, uint32 len) { IMU963RA_CS(0); spi_read_8bit_registers(IMU963RA_SPI, reg | IMU963RA_SPI_R, data, len); @@ -168,11 +170,11 @@ static uint8 imu963ra_write_mag_register (uint8 addr, uint8 reg, uint8 data) imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -197,19 +199,19 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) addr = addr << 1; imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 - + // 等待通讯成功 while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) { - if(timeout_count ++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { break; } system_delay_ms(2); } - + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 } @@ -224,12 +226,12 @@ static uint8 imu963ra_read_mag_register (uint8 addr, uint8 reg) static void imu963ra_connect_mag (uint8 addr, uint8 reg) { addr = addr << 1; - + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 - imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 -} +} //------------------------------------------------------------------------------------------------------------------- @@ -247,7 +249,7 @@ static uint8 imu963ra_acc_gyro_self_check (void) while(0x6B != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -273,7 +275,7 @@ static uint8 imu963ra_mag_self_check (void) while(0xff != dat) // 判断 ID 是否正确 { - if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) + if(IMU963RA_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -344,69 +346,6 @@ void imu963ra_get_mag (void) imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); } -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的加速度计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); //单位为 g(m/s^2) -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_acc_transition (int16 acc_value) -{ - float acc_data = 0; - switch(IMU963RA_ACC_SAMPLE) - { - case 0x30: acc_data = (float)acc_value / 16393; break; // 0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x38: acc_data = (float)acc_value / 8197; break; // 0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x3C: acc_data = (float)acc_value / 4098; break; // 0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - case 0x34: acc_data = (float)acc_value / 2049; break; // 0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) - default: break; - } - return acc_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的陀螺仪数据 -// 返回参数 void -// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_gyro_transition (int16 gyro_value) -{ - float gyro_data = 0; - switch(IMU963RA_GYR_SAMPLE) - { - case 0x52: gyro_data = (float)gyro_value / 228.6f; break; // 0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x50: gyro_data = (float)gyro_value / 114.3f; break; // 0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x54: gyro_data = (float)gyro_value / 57.1f; break; // 0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - case 0x58: gyro_data = (float)gyro_value / 28.6f; break; // 0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - case 0x5C: gyro_data = (float)gyro_value / 14.3f; break; // 0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - case 0x51: gyro_data = (float)gyro_value / 7.1f; break; // 0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s - default: break; - } - return gyro_data; -} - -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 将 IMU963RA 地磁计数据转换为实际物理数据 -// 参数说明 gyro_value // 任意轴的地磁计数据 -// 返回参数 void -// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为°/s -// 备注信息 -//------------------------------------------------------------------------------------------------------------------- -float imu963ra_mag_transition (int16 mag_value) -{ - float mag_data = 0; - switch(IMU963RA_MAG_SAMPLE) - { - case 0x19: mag_data = (float)mag_value / 3000; break; // 0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - case 0x09: mag_data = (float)mag_value / 12000; break; // 0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - default: break; - } - return mag_data; -} - //------------------------------------------------------------------------------------------------------------------- // 函数简介 初始化 IMU963RA // 参数说明 void @@ -440,52 +379,145 @@ uint8 imu963ra_init (void) } imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, IMU963RA_ACC_SAMPLE); // 设置加速度计量程±8G以及数据输出速率52hz 以及加速度信息从第一级滤波器输出 + // IMU963RA_CTRL1_XL 寄存器 - // 设置为:0x30 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x38 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x3C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) - // 设置为:0x34 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + // 设置为 0x30 加速度量程为 ±2 G 获取到的加速度计数据除以 16393 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x38 加速度量程为 ±4 G 获取到的加速度计数据除以 8197 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x3C 加速度量程为 ±8 G 获取到的加速度计数据除以 4098 可以转化为带物理单位的数据 单位 g(m/s^2) + // 设置为 0x34 加速度量程为 ±16 G 获取到的加速度计数据除以 2049 可以转化为带物理单位的数据 单位 g(m/s^2) + switch(IMU963RA_ACC_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_ACC_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_ACC_SAMPLE_SGN_2G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x30); + imu963ra_transition_factor[0] = 16393; + }break; + case IMU963RA_ACC_SAMPLE_SGN_4G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x38); + imu963ra_transition_factor[0] = 8197; + }break; + case IMU963RA_ACC_SAMPLE_SGN_8G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x3C); + imu963ra_transition_factor[0] = 4098; + }break; + case IMU963RA_ACC_SAMPLE_SGN_16G: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x34); + imu963ra_transition_factor[0] = 2049; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, IMU963RA_GYR_SAMPLE); // 设置陀螺仪计量程 ±2000dps 以及数据输出速率 208hz // IMU963RA_CTRL2_G 寄存器 - // 设置为:0x52 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x50 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x54 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x58 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x5C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x51 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + // 设置为 0x52 陀螺仪量程为 ±125 dps 获取到的陀螺仪数据除以 228.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x50 陀螺仪量程为 ±250 dps 获取到的陀螺仪数据除以 114.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x54 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 57.1 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x58 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 28.6 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x5C 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 14.3 可以转化为带物理单位的数据 单位为 °/s + // 设置为 0x51 陀螺仪量程为 ±4000 dps 获取到的陀螺仪数据除以 7.1 可以转化为带物理单位的数据 单位为 °/s + switch(IMU963RA_GYRO_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_GYRO_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_125DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x52); + imu963ra_transition_factor[1] = 228.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_250DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x50); + imu963ra_transition_factor[1] = 114.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_500DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x54); + imu963ra_transition_factor[1] = 57.1; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_1000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x58); + imu963ra_transition_factor[1] = 28.6; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_2000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x5C); + imu963ra_transition_factor[1] = 14.3; + }break; + case IMU963RA_GYRO_SAMPLE_SGN_4000DPS: + { + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x51); + imu963ra_transition_factor[1] = 7.1; + }break; + } + if(1 == return_state) + { + break; + } - imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz - imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 - imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 - imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + system_delay_ms(2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 system_delay_ms(2); - imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 - system_delay_ms(2); - - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80);// 复位连接的外设 system_delay_ms(2); imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); system_delay_ms(2); - if(imu963ra_mag_self_check()) { zf_log(0, "IMU963RA mag self check error."); return_state = 1; - break; + break; } - imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, IMU963RA_MAG_SAMPLE); // 设置磁力计量程8G 输出速率100hz 连续模式 // IMU963RA_MAG_ADDR 寄存器 - // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) - // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + // 设置为 0x09 磁力计量程为 2G 获取到的磁力计数据除以 12000 可以转化为带物理单位的数据 单位 G(高斯) + // 设置为 0x19 磁力计量程为 8G 获取到的磁力计数据除以 3000 可以转化为带物理单位的数据 单位 G(高斯) + switch(IMU963RA_MAG_SAMPLE_DEFAULT) + { + default: + { + zf_log(0, "IMU963RA_MAG_SAMPLE_DEFAULT set error."); + return_state = 1; + }break; + case IMU963RA_MAG_SAMPLE_2G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x09); + imu963ra_transition_factor[2] = 12000; + }break; + case IMU963RA_MAG_SAMPLE_8G: + { + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); + imu963ra_transition_factor[2] = 3000; + }break; + } + if(1 == return_state) + { + break; + } imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu963ra.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu963ra.h index cddb99f..2ed160a 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu963ra.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_imu963ra.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -59,6 +60,7 @@ #include "zf_common_typedef.h" +//================================================定义 IMU963RA 基本配置================================================ #define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -67,6 +69,7 @@ #define IMU963RA_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 IMU963RA 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== #else + //====================================================硬件 SPI 驱动==================================================== #define IMU963RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率 #define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 @@ -79,7 +82,36 @@ #define IMU963RA_CS_PIN (P20_13) // CS 片选引脚 #define IMU963RA_CS(x) (x? (gpio_high(IMU963RA_CS_PIN)): (gpio_low(IMU963RA_CS_PIN))) +typedef enum +{ + IMU963RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) + IMU963RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) +}imu963ra_acc_sample_config; + +typedef enum +{ + IMU963RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) + IMU963RA_GYRO_SAMPLE_SGN_4000DPS, // 陀螺仪量程 ±4000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) +}imu963ra_gyro_sample_config; + +typedef enum +{ + IMU963RA_MAG_SAMPLE_2G, // 磁力计量程 2G (MAG = Magnetometer 磁力计) (G = Gs 高斯) + IMU963RA_MAG_SAMPLE_8G, // 磁力计量程 8G (MAG = Magnetometer 磁力计) (G = Gs 高斯) +}imu963ra_mag_sample_config; + +#define IMU963RA_ACC_SAMPLE_DEFAULT ( IMU963RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 +#define IMU963RA_GYRO_SAMPLE_DEFAULT ( IMU963RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 +#define IMU963RA_MAG_SAMPLE_DEFAULT ( IMU963RA_MAG_SAMPLE_8G ) // 在这设置默认的 磁力计 初始化量程 #define IMU963RA_TIMEOUT_COUNT (0x00FF) // IMU963RA 超时计数 +//================================================定义 IMU963RA 基本配置================================================ + //================================================定义 IMU963RA 内部地址================================================ #define IMU963RA_DEV_ADDR (0x6B) // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 @@ -133,24 +165,52 @@ #define IMU963RA_MAG_SAMPLE (0x19) // 地磁计量程 // 设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) // 设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) - //================================================定义 IMU963RA 内部地址================================================ -//===============================================声明 IMU963RA 数据存储变量=============================================== -extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴陀螺仪数据 -extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴加速度计数据 -extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴地磁计数据 -//===============================================声明 IMU963RA 数据存储变量=============================================== -//==================================================IMU963RA 基础函数================================================== -void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 -void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 -void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 -float imu963ra_acc_transition (int16 acc_value); // 将 IMU963RA 加速度计数据转换为实际物理数据 -float imu963ra_gyro_transition (int16 gyro_value); // 将 IMU963RA 陀螺仪数据转换为实际物理数据 -float imu963ra_mag_transition (int16 mag_value); // 将 IMU963RA 地磁计数据转换为实际物理数据 -uint8 imu963ra_init (void); // 初始化 IMU963RA -//==================================================IMU963RA 基础函数================================================== +//================================================声明 IMU963RA 全局变量================================================ +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; // 三轴陀螺仪数据 GYRO (陀螺仪) +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; // 三轴加速度计数据 ACC (accelerometer 加速度计) +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; // 三轴磁力计数据 MAG (magnetometer 磁力计) +extern float imu963ra_transition_factor[3]; // 转换实际值的比例 +//================================================声明 IMU963RA 全局变量================================================ +//================================================声明 IMU963RA 基础函数================================================ +void imu963ra_get_acc (void); // 获取 IMU963RA 加速度计数据 +void imu963ra_get_gyro (void); // 获取 IMU963RA 陀螺仪数据 +void imu963ra_get_mag (void); // 获取 IMU963RA 磁力计数据 +uint8 imu963ra_init (void); // 初始化 IMU963RA +//================================================声明 IMU963RA 基础函数================================================ + + +//================================================声明 IMU963RA 拓展函数================================================ +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 加速度计数据转换为实际物理数据 +// 参数说明 acc_value 任意轴的加速度计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_acc_transition(imu963ra_acc_x); // 单位为 g(m/s^2) +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_acc_transition(acc_value) ((float)acc_value / imu963ra_transition_factor[0]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 陀螺仪数据转换为实际物理数据 +// 参数说明 gyro_value 任意轴的陀螺仪数据 +// 返回参数 void +// 使用示例 float data = imu963ra_gyro_transition(imu963ra_gyro_x); // 单位为 °/s +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_gyro_transition(gyro_value) ((float)gyro_value / imu963ra_transition_factor[1]) + +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 将 IMU963RA 磁力计数据转换为实际物理数据 +// 参数说明 mag_value 任意轴的磁力计数据 +// 返回参数 void +// 使用示例 float data = imu963ra_mag_transition(imu963ra_mag_x); // 单位为 G +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define imu963ra_mag_transition(mag_value) ((float)mag_value / imu963ra_transition_factor[2]) +//================================================声明 IMU963RA 拓展函数================================================ + #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.c index 9a14f5a..68bc09d 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -56,13 +57,13 @@ #include "zf_driver_spi.h" #include "zf_device_ips114.h" -static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; -static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; +static uint16 ips114_pencolor = IPS114_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips114_bgcolor = IPS114_DEFAULT_BGCOLOR; // 背景颜色 -static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; -static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; -static uint8 ips114_x_max = 240; -static uint8 ips114_y_max = 135; +static ips114_dir_enum ips114_display_dir = IPS114_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips114_font_size_enum ips114_display_font = IPS114_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint8 ips114_x_max = 240; // 屏幕X轴像素最大值 +static uint8 ips114_y_max = 135; // 屏幕Y轴像素最大值 #if IPS114_USE_SOFT_SPI static soft_spi_info_struct ips114_spi; @@ -137,45 +138,48 @@ static void ips114_set_region (const uint16 x1, const uint16 y1, const uint16 x2 zf_assert(x2 < ips114_x_max); zf_assert(y2 < ips114_y_max); - if(ips114_display_dir == IPS114_PORTAIT) + switch(ips114_display_dir) { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 52); - ips114_write_16bit_data(x2 + 52); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_PORTAIT_180) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 53); - ips114_write_16bit_data(x2 + 53); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 40); - ips114_write_16bit_data(y2 + 40); - ips114_write_index(0x2c); // 储存器写 - } - else if(ips114_display_dir == IPS114_CROSSWISE) - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 53); - ips114_write_16bit_data(y2 + 53); - ips114_write_index(0x2c); // 储存器写 - } - else - { - ips114_write_index(0x2a); // 列地址设置 - ips114_write_16bit_data(x1 + 40); - ips114_write_16bit_data(x2 + 40); - ips114_write_index(0x2b); // 行地址设置 - ips114_write_16bit_data(y1 + 52); - ips114_write_16bit_data(y2 + 52); - ips114_write_index(0x2c); // 储存器写 + case IPS114_PORTAIT: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 52); + ips114_write_16bit_data(x2 + 52); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_PORTAIT_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 53); + ips114_write_16bit_data(x2 + 53); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 40); + ips114_write_16bit_data(y2 + 40); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 53); + ips114_write_16bit_data(y2 + 53); + ips114_write_index(0x2c); // 储存器写 + }break; + case IPS114_CROSSWISE_180: + { + ips114_write_index(0x2a); // 列地址设置 + ips114_write_16bit_data(x1 + 40); + ips114_write_16bit_data(x2 + 40); + ips114_write_index(0x2b); // 行地址设置 + ips114_write_16bit_data(y1 + 52); + ips114_write_16bit_data(y2 + 52); + ips114_write_index(0x2c); // 储存器写 + }break; } } @@ -198,20 +202,23 @@ static void ips114_debug_init (void) switch(ips114_display_font) { case IPS114_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case IPS114_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = ips114_show_string; info.output_screen_clear = ips114_clear; - + debug_output_init(&info); } @@ -228,7 +235,7 @@ void ips114_clear (void) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(ips114_bgcolor); } @@ -240,7 +247,7 @@ void ips114_clear (void) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_full(RGB565_BLACK); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_full (const uint16 color) { @@ -248,7 +255,7 @@ void ips114_full (const uint16 color) IPS114_CS(0); ips114_set_region(0, 0, ips114_x_max - 1, ips114_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { ips114_write_16bit_data(color); } @@ -265,15 +272,20 @@ void ips114_full (const uint16 color) void ips114_set_dir (ips114_dir_enum dir) { ips114_display_dir = dir; - if(dir < 2) + switch(ips114_display_dir) { - ips114_x_max = 135; - ips114_y_max = 240; - } - else - { - ips114_x_max = 240; - ips114_y_max = 135; + case IPS114_PORTAIT: + case IPS114_PORTAIT_180: + { + ips114_x_max = 135; + ips114_y_max = 240; + }break; + case IPS114_CROSSWISE: + case IPS114_CROSSWISE_180: + { + ips114_x_max = 240; + ips114_y_max = 135; + }break; } } @@ -310,7 +322,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_point (uint16 x, uint16 y, const uint16 color) { @@ -334,7 +346,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color) // 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入 // 返回参数 void // 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color) { @@ -394,7 +406,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en // 参数说明 dat 需要显示的字符 // 返回参数 void // 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_char (uint16 x, uint16 y, const char dat) { @@ -403,18 +415,19 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - uint8 i, j; + uint8 i = 0, j = 0; IPS114_CS(0); switch(ips114_display_font) { case IPS114_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -427,15 +440,16 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS114_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips114_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -447,7 +461,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -460,10 +474,11 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS114_16X16_FONT: + { // 暂不支持 - break; + }break; } IPS114_CS(1); } @@ -475,7 +490,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat) // 参数说明 dat 需要显示的字符串 // 返回参数 void // 使用示例 ips114_show_string(0, 0, "seekfree"); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_string (uint16 x, uint16 y, const char dat[]) { @@ -483,24 +498,17 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - + uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips114_display_font) { - case IPS114_6X8_FONT: - ips114_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS114_8X16_FONT: - ips114_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS114_16X16_FONT: - // 暂不支持 - break; + case IPS114_6X8_FONT: ips114_show_char(x + 6 * j, y, dat[j]); break; + case IPS114_8X16_FONT: ips114_show_char(x + 8 * j, y, dat[j]); break; + case IPS114_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -512,7 +520,7 @@ void ips114_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -520,8 +528,8 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -530,9 +538,10 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -550,7 +559,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -558,8 +567,8 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -567,9 +576,10 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -583,15 +593,15 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS114 显示浮点数 (去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_y_max-1] -// 参数说明 dat 需要显示的变量 数据类型 float 或 double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -599,10 +609,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -610,14 +620,12 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips114_show_string(x, y, data_buffer); } @@ -633,7 +641,10 @@ void ips114_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -641,7 +652,7 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -682,7 +693,10 @@ void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips114_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -690,7 +704,7 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -738,7 +752,10 @@ void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips114_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -746,7 +763,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -783,7 +800,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_y_max] // 返回参数 void // 使用示例 ips114_show_wave(56,35,data,128,64,128,64); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -791,7 +808,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -802,7 +819,7 @@ void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips114_write_16bit_data(ips114_bgcolor); + ips114_write_16bit_data(ips114_bgcolor); } } IPS114_CS(1); @@ -833,17 +850,17 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; IPS114_CS(0); ips114_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -852,7 +869,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -867,7 +884,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } IPS114_CS(1); } @@ -877,7 +894,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 void // 返回参数 void // 使用示例 ips114_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips114_init (void) { @@ -887,14 +904,13 @@ void ips114_init (void) spi_init(IPS114_SPI, SPI_MODE0, IPS114_SPI_SPEED, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, SPI_CS_NULL); #endif - gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(IPS114_DC_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_RST_PIN, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS114_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); gpio_init(IPS114_BLK_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); ips114_set_dir(ips114_display_dir); ips114_set_color(ips114_pencolor, ips114_bgcolor); - ips114_debug_init(); IPS114_RST(0); system_delay_ms(200); @@ -905,21 +921,12 @@ void ips114_init (void) IPS114_CS(0); ips114_write_index(0x36); system_delay_ms(100); - if(ips114_display_dir == 0) + switch(ips114_display_dir) { - ips114_write_8bit_data(0x00); - } - else if(ips114_display_dir == 1) - { - ips114_write_8bit_data(0xC0); - } - else if(ips114_display_dir == 2) - { - ips114_write_8bit_data(0x70); - } - else - { - ips114_write_8bit_data(0xA0); + case IPS114_PORTAIT: ips114_write_8bit_data(0x00); break; + case IPS114_PORTAIT_180: ips114_write_8bit_data(0xC0); break; + case IPS114_CROSSWISE: ips114_write_8bit_data(0x70); break; + case IPS114_CROSSWISE_180: ips114_write_8bit_data(0xA0); break; } ips114_write_index(0x3A); @@ -998,4 +1005,5 @@ void ips114_init (void) IPS114_CS(1); ips114_clear(); + ips114_debug_init(); } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.h index 331b3ff..c897e5d 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -53,6 +54,7 @@ #include "zf_common_typedef.h" +//=================================================定义 IPS114 基本配置================================================ #define IPS114_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS114_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动================================================== @@ -84,6 +86,8 @@ #define IPS114_RST(x) ((x) ? (gpio_high(IPS114_RST_PIN)) : (gpio_low(IPS114_RST_PIN))) #define IPS114_CS(x) ((x) ? (gpio_high(IPS114_CS_PIN)) : (gpio_low(IPS114_CS_PIN))) #define IPS114_BLK(x) ((x) ? (gpio_high(IPS114_BLK_PIN)) : (gpio_low(IPS114_BLK_PIN))) +//=================================================定义 IPS114 基本配置================================================ + //=================================================定义 IPS114 参数结构体=============================================== typedef enum @@ -102,32 +106,33 @@ typedef enum }ips114_font_size_enum; //=================================================定义 IPS114 参数结构体=============================================== -//===================================================IPS114 基础函数================================================== -void ips114_clear (void); -void ips114_full (const uint16 color); -void ips114_set_dir (ips114_dir_enum dir); -void ips114_set_font (ips114_font_size_enum font); -void ips114_set_color (const uint16 pen, const uint16 bgcolor); -void ips114_draw_point (uint16 x, uint16 y, const uint16 color); -void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void ips114_show_char (uint16 x, uint16 y, const char dat); -void ips114_show_string (uint16 x, uint16 y, const char dat[]); -void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 IPS114 基础函数================================================ +void ips114_clear (void); // IPS114 清屏函数 +void ips114_full (const uint16 color); // IPS114 屏幕填充函数 +void ips114_set_dir (ips114_dir_enum dir); // IPS114 设置显示方向 +void ips114_set_font (ips114_font_size_enum font); // IPS114 设置显示字体 +void ips114_set_color (const uint16 pen, const uint16 bgcolor); // IPS114 设置显示颜色 +void ips114_draw_point (uint16 x, uint16 y, const uint16 color); // IPS114 画点函数 +void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS114 画线函数 -void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void ips114_show_char (uint16 x, uint16 y, const char dat); // IPS114 显示字符 +void ips114_show_string (uint16 x, uint16 y, const char dat[]); // IPS114 显示字符串 +void ips114_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // IPS114 显示32位有符号 (去除整数部分无效的0) +void ips114_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // IPS114 显示32位无符号 (去除整数部分无效的0) +void ips114_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS114 显示浮点数 (去除整数部分无效的0) -void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); -void ips114_init (void); -//===================================================IPS114 基础函数================================================== +void ips114_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS114 显示二值图像 数据每八个点组成一个字节数据 +void ips114_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS114 显示 8bit 灰度图像 带二值化阈值 +void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS114 显示 RGB565 彩色图像 + +void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS114 显示波形 +void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS114 汉字显示 +void ips114_init (void); // 1.14寸 IPS液晶初始化 +//=================================================声明 IPS114 基础函数================================================ -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS114 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -160,7 +165,6 @@ void ips114_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips114_displayimage8660(p, width, height) (ips114_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS114 扩展函数================================================== +//=================================================声明 IPS114 扩展函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips200.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips200.c index 0170435..ba51064 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips200.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips200.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -69,18 +70,20 @@ #include "zf_driver_spi.h" #include "zf_device_ips200.h" -static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; -static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; -static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; -static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; -static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; -static uint16 ips200_x_max = 240; -static uint16 ips200_y_max = 320; +static ips200_type_enum ips200_display_type = IPS200_TYPE_SPI; // 定义通信类型,默认SPI单排针 -static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; -static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; +static uint16 ips200_pencolor = IPS200_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 ips200_bgcolor = IPS200_DEFAULT_BGCOLOR; // 背景颜色 +static ips200_dir_enum ips200_display_dir = IPS200_DEFAULT_DISPLAY_DIR; // 显示方向 +static ips200_font_size_enum ips200_display_font = IPS200_DEFAULT_DISPLAY_FONT; // 显示字体类型 +static uint16 ips200_x_max = 240; // 屏幕X轴像素最大值 +static uint16 ips200_y_max = 320; // 屏幕Y轴像素最大值 + +static gpio_pin_enum ips_rst_pin = IPS200_RST_PIN_SPI; // 定义复位所用引脚 +static gpio_pin_enum ips_bl_pin = IPS200_BLk_PIN_SPI; // 定义背光所用引脚 +static gpio_pin_enum ips_cs_pin = IPS200_CS_PIN_SPI; // 定义片选所用引脚 #if IPS200_USE_SOFT_SPI static soft_spi_info_struct ips200_spi; @@ -288,7 +291,7 @@ static void ips200_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void ips200_clear (void) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -298,7 +301,7 @@ void ips200_clear (void) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -316,7 +319,7 @@ void ips200_clear (void) //------------------------------------------------------------------------------------------------------------------- void ips200_full (const uint16 color) { - uint16 i, j; + uint16 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); @@ -326,7 +329,7 @@ void ips200_full (const uint16 color) { for (j = 0; j < ips200_y_max; j ++) { - ips200_write_16bit_data(color); + ips200_write_16bit_data(color); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -345,15 +348,20 @@ void ips200_full (const uint16 color) void ips200_set_dir (ips200_dir_enum dir) { ips200_display_dir = dir; - if(dir < 2) + switch(ips200_display_dir) { - ips200_x_max = 240; - ips200_y_max = 320; - } - else - { - ips200_x_max = 320; - ips200_y_max = 240; + case IPS200_PORTAIT: + case IPS200_PORTAIT_180: + { + ips200_x_max = 240; + ips200_y_max = 320; + }break; + case IPS200_CROSSWISE: + case IPS200_CROSSWISE_180: + { + ips200_x_max = 320; + ips200_y_max = 240; + }break; } } @@ -489,7 +497,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - uint8 i, j; + uint8 i = 0, j = 0; if(IPS200_TYPE_SPI == ips200_display_type) { @@ -498,12 +506,13 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) switch(ips200_display_font) { case IPS200_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -516,15 +525,16 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case IPS200_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { ips200_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -536,7 +546,7 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -549,10 +559,11 @@ void ips200_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case IPS200_16X16_FONT: + { // 暂不支持 - break; + }break; } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -577,22 +588,15 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < ips200_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(ips200_display_font) { - case IPS200_6X8_FONT: - ips200_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case IPS200_8X16_FONT: - ips200_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case IPS200_16X16_FONT: - // 暂不支持 - break; + case IPS200_6X8_FONT: ips200_show_char(x + 6 * j, y, dat[j]); break; + case IPS200_8X16_FONT: ips200_show_char(x + 8 * j, y, dat[j]); break; + case IPS200_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -604,7 +608,7 @@ void ips200_show_string (uint16 x, uint16 y, const char dat[]) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_int(0, 0, x, 3); // x 可以为 int32 int16 int8 类型 -// 备注信息 负数会显示一个 ‘-’号 正数显示一个空格 +// 备注信息 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) { @@ -612,8 +616,8 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -622,9 +626,10 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num+1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -642,7 +647,7 @@ void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 参数说明 num 需要显示的位数 最高10位 不包含正负号 // 返回参数 void // 使用示例 ips200_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型 -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) { @@ -650,8 +655,8 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -659,9 +664,10 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -675,15 +681,15 @@ void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 函数简介 IPS200 显示浮点数(去除整数部分无效的0) // 参数说明 x 坐标x方向的起点 参数范围 [0, ips200_x_max-1] // 参数说明 y 坐标y方向的起点 参数范围 [0, ips200_y_max-1] -// 参数说明 dat 需要显示的变量,数据类型float或double -// 参数说明 num 整数位显示长度 最高8位 +// 参数说明 dat 需要显示的变量 数据类型 float +// 参数说明 num 整数位显示长度 最高8位 // 参数说明 pointnum 小数位显示长度 最高6位 // 返回参数 void // 使用示例 ips200_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示2位 小数显示三位 // 备注信息 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 +// 负数会显示一个 ‘-’号 //------------------------------------------------------------------------------------------------------------------- void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum) { @@ -691,10 +697,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -702,14 +708,12 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po memset(data_buffer, 0, 17); memset(data_buffer, ' ', num+pointnum+2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); ips200_show_string(x, y, data_buffer); } @@ -725,7 +729,10 @@ void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 参数说明 dis_height 图像显示高度 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_binary_image(0, 0, ov7725_image_binary[0], OV7725_W, OV7725_H, OV7725_W, OV7725_H); -// 备注信息 +// 备注信息 用于显示小钻风的未解压的压缩二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 +// 这个函数不可以用来直接显示总钻风的未压缩的二值化图像 //------------------------------------------------------------------------------------------------------------------- void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { @@ -733,7 +740,7 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint8 temp = 0; @@ -780,7 +787,10 @@ void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 ips200_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W, MT9V03X_H, 0); -// 备注信息 最后一个参数可以选填一个二值化阈值 把图像显示为二值化图像 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -788,7 +798,7 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -842,7 +852,10 @@ void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 参数说明 color_mode 色彩模式 0-低位在前 1-高位在前 // 返回参数 void // 使用示例 ips200_show_rgb565_image(0, 0, scc8660_image[0], SCC8660_W, SCC8660_H, SCC8660_W, SCC8660_H, 1); -// 备注信息 +// 备注信息 用于显示凌瞳的 RGB565 的图像 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 +// 如果要显示低位在前的其他 RGB565 图像 修改最后一个参数即可 //------------------------------------------------------------------------------------------------------------------- void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode) { @@ -850,7 +863,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -868,7 +881,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w for(i = 0; i < dis_width; i ++) { width_index = i * width / dis_width; - color = *((uint16 *)(image + height_index * width + width_index)); // 读取像素点 + color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) { color = ((color & 0xff) << 8) | (color >> 8); @@ -893,7 +906,7 @@ void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips200_y_max] // 返回参数 void // 使用示例 ips200_show_wave(0, 0, data, 128, 64, 64, 32); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max) { @@ -901,7 +914,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -915,7 +928,7 @@ void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin { for(j = 0; j < dis_width; j ++) { - ips200_write_16bit_data(ips200_bgcolor); + ips200_write_16bit_data(ips200_bgcolor); } } if(IPS200_TYPE_SPI == ips200_display_type) @@ -949,20 +962,20 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < ips200_x_max); zf_assert(y < ips200_y_max); - zf_assert(chinese_buffer != NULL); - - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + zf_assert(NULL != chinese_buffer); + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; + temp2 = size / 8; - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } ips200_set_region(x, y, number * size - 1 + x, y + size - 1); - + for(i = 0; i < size; i ++) { temp1 = number; @@ -971,7 +984,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; if(temp) @@ -986,7 +999,7 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b p_data ++; } p_data = p_data - temp2 + temp2 * size; - } + } } if(IPS200_TYPE_SPI == ips200_display_type) { @@ -999,18 +1012,16 @@ void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 参数说明 type_select 两寸屏接口类型 IPS200_TYPE_SPI 为 SPI 接口串口两寸屏 IPS200_TYPE_PARALLEL8 为 8080 协议八位并口两寸屏 // 返回参数 void // 使用示例 ips200_init(IPS200_TYPE_PARALLEL8); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void ips200_init (ips200_type_enum type_select) { - ips200_set_dir(ips200_display_dir); - ips200_set_color(ips200_pencolor, ips200_bgcolor); - if(IPS200_TYPE_SPI == type_select) { ips200_display_type = IPS200_TYPE_SPI; ips_rst_pin = IPS200_RST_PIN_SPI; ips_bl_pin = IPS200_BLk_PIN_SPI; + ips_cs_pin = IPS200_CS_PIN_SPI; #if IPS200_USE_SOFT_SPI soft_spi_init(&ips200_spi, 0, IPS200_SOFT_SPI_DELAY, IPS200_SCL_PIN, IPS200_SDA_PIN, SOFT_SPI_PIN_NULL, SOFT_SPI_PIN_NULL); #else @@ -1018,58 +1029,60 @@ void ips200_init (ips200_type_enum type_select) #endif gpio_init(IPS200_DC_PIN_SPI, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_CS_PIN_SPI, GPO, GPIO_HIGH, GPO_PUSH_PULL); - gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); + gpio_init(ips_bl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); } else { ips200_display_type = IPS200_TYPE_PARALLEL8; ips_rst_pin = IPS200_RST_PIN_PARALLEL8; ips_bl_pin = IPS200_BL_PIN_PARALLEL8; + ips_cs_pin = IPS200_CS_PIN_PARALLEL8; gpio_init(ips_rst_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // RTS gpio_init(ips_bl_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // BL - gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(ips_cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_CS - gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); - gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_RD + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, GPIO_LOW, GPO_PUSH_PULL); // LCD_WR + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_RS + + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D0 + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D1 + + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D2 + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D3 + + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D4 + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D5 + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D6 + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, GPIO_HIGH, GPO_PUSH_PULL); // LCD_D7 } ips200_set_dir(ips200_display_dir); ips200_set_color(ips200_pencolor, ips200_bgcolor); - ips200_debug_init(); - + IPS200_BL(1); - IPS200_RST(0); + IPS200_RST(0); system_delay_ms(5); - IPS200_RST(1); + IPS200_RST(1); system_delay_ms(120); - + if(IPS200_TYPE_SPI == ips200_display_type) { IPS200_CS(0); } - ips200_write_command(0x11); system_delay_ms(120); ips200_write_command(0x36); switch(ips200_display_dir) { - case 0: ips200_write_8bit_data(0x00); break; - case 1: ips200_write_8bit_data(0xC0); break; - case 2: ips200_write_8bit_data(0x70); break; - default:ips200_write_8bit_data(0xA0); break; + case IPS200_PORTAIT: ips200_write_8bit_data(0x00); break; + case IPS200_PORTAIT_180: ips200_write_8bit_data(0xC0); break; + case IPS200_CROSSWISE: ips200_write_8bit_data(0x70); break; + case IPS200_CROSSWISE_180: ips200_write_8bit_data(0xA0); break; } ips200_write_command(0x3A); @@ -1148,5 +1161,6 @@ void ips200_init (ips200_type_enum type_select) } ips200_clear(); // 初始化为白屏 + ips200_debug_init(); } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips200.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips200.h index 97bd024..176236e 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips200.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips200.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /******************************************************************************************************************** * 接线定义: @@ -65,6 +66,7 @@ #include "zf_common_typedef.h" +//==================================================定义 IPS200 基本配置================================================ #define IPS200_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if IPS200_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,49 +86,44 @@ //====================================================硬件 SPI 驱动==================================================== #endif // 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 -#define IPS200_RST_PIN_SPI (P15_1) // 液晶复位引脚定义 -#define IPS200_DC_PIN_SPI (P15_0) // 液晶命令位引脚定义 -#define IPS200_CS_PIN_SPI (P15_2) -#define IPS200_BLk_PIN_SPI (P15_4) +#define IPS200_RST_PIN_SPI (P15_1) // 单排针(SPI)液晶复位引脚定义 +#define IPS200_DC_PIN_SPI (P15_0) // 单排针(SPI)液晶命令位引脚定义 +#define IPS200_CS_PIN_SPI (P15_2) // 单排针(SPI)液晶片选引脚定义 +#define IPS200_BLk_PIN_SPI (P15_4) // 单排针(SPI)液晶背光引脚定义 // 如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RST_PIN_PARALLEL8 (P15_0) -#define IPS200_BL_PIN_PARALLEL8 (P15_4) - -//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 -#define IPS200_RD_PIN_PARALLEL8 (P15_3) -#define IPS200_WR_PIN_PARALLEL8 (P15_5) -#define IPS200_RS_PIN_PARALLEL8 (P15_1) -#define IPS200_CS_PIN_PARALLEL8 (P15_2) - +#define IPS200_RD_PIN_PARALLEL8 (P15_3) // 双排针(并口)液晶读取位引脚定义 +#define IPS200_WR_PIN_PARALLEL8 (P15_5) // 双排针(并口)液晶写入位引脚定义 +#define IPS200_RST_PIN_PARALLEL8 (P15_0) // 双排针(并口)液晶复位引脚定义 +#define IPS200_RS_PIN_PARALLEL8 (P15_1) // 双排针(并口)液晶命令位引脚定义 +#define IPS200_CS_PIN_PARALLEL8 (P15_2) // 双排针(并口)液晶片选引脚定义 +#define IPS200_BL_PIN_PARALLEL8 (P15_4) // 双排针(并口)液晶背光引脚定义 //并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 //D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, //D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 //可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 //切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) -#define IPS200_D1_PIN_PARALLEL8 (P11_10) -#define IPS200_D2_PIN_PARALLEL8 (P11_11) -#define IPS200_D3_PIN_PARALLEL8 (P11_12) -#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) -#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) -#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) -#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) +#define IPS200_D0_PIN_PARALLEL8 (P11_9 ) // 双排针(并口)液晶数据引脚D0 +#define IPS200_D1_PIN_PARALLEL8 (P11_10) // 双排针(并口)液晶数据引脚D1 +#define IPS200_D2_PIN_PARALLEL8 (P11_11) // 双排针(并口)液晶数据引脚D2 +#define IPS200_D3_PIN_PARALLEL8 (P11_12) // 双排针(并口)液晶数据引脚D3 +#define IPS200_D4_PIN_PARALLEL8 (P13_0 ) // 双排针(并口)液晶数据引脚D4 +#define IPS200_D5_PIN_PARALLEL8 (P13_1 ) // 双排针(并口)液晶数据引脚D5 +#define IPS200_D6_PIN_PARALLEL8 (P13_2 ) // 双排针(并口)液晶数据引脚D6 +#define IPS200_D7_PIN_PARALLEL8 (P13_3 ) // 双排针(并口)液晶数据引脚D7 #define IPS200_DEFAULT_DISPLAY_DIR (IPS200_PORTAIT) // 默认的显示方向 #define IPS200_DEFAULT_PENCOLOR (RGB565_RED ) // 默认的画笔颜色 #define IPS200_DEFAULT_BGCOLOR (RGB565_WHITE ) // 默认的背景颜色 #define IPS200_DEFAULT_DISPLAY_FONT (IPS200_8X16_FONT) // 默认的字体模式 -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 这里使用了两组端口进行组合 因此定义了两个引脚起始编号 #define IPS200_DATA_PORT1 (3) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT1 (get_port_out_addr(IPS200_DATA_PORT1)) -#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 宏定义数据引脚的起始编号 - - +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 #define IPS200_DATA_PORT2 (4) //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 #define IPS200_DATAPORT2 (get_port_out_addr(IPS200_DATA_PORT2)) -#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) // 定义数据引脚的起始编号 // 控制语句 #define IPS200_RD(x) ((x) ? (gpio_high(IPS200_RD_PIN_PARALLEL8)) : (gpio_low(IPS200_RD_PIN_PARALLEL8))) @@ -136,8 +133,10 @@ #define IPS200_RS(x) ((x) ? (gpio_high(IPS200_RS_PIN_PARALLEL8)) : (gpio_low(IPS200_RS_PIN_PARALLEL8))) #define IPS200_DC(x) ((x) ? (gpio_high(IPS200_DC_PIN_SPI)) : (gpio_low(IPS200_DC_PIN_SPI))) #define IPS200_CS(x) ((x) ? (gpio_high(IPS200_CS_PIN_SPI)) : (gpio_low(IPS200_CS_PIN_SPI))) +//==================================================定义 IPS200 基本配置================================================ -//=================================================定义 IPS200 参数结构体=============================================== + +//==================================================定义 IPS200 参数结构体=============================================== typedef enum { IPS200_TYPE_SPI, // SPI 驱动 @@ -158,36 +157,36 @@ typedef enum IPS200_8X16_FONT = 1, // 8x16 字体 IPS200_16X16_FONT = 2, // 16x16 字体 目前不支持 }ips200_font_size_enum; -//=================================================定义 IPS200 参数结构体=============================================== - -//===================================================IPS200 基础函数================================================== -void ips200_clear (void); -void ips200_full (const uint16 color); -void ips200_set_dir (ips200_dir_enum dir); -void ips200_set_font (ips200_font_size_enum font); -void ips200_set_color (const uint16 pen, const uint16 bgcolor); -void ips200_draw_point (uint16 x, uint16 y, const uint16 color); -void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); - -void ips200_show_char (uint16 x, uint16 y, const char dat); -void ips200_show_string (uint16 x, uint16 y, const char dat[]); -void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); - -void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); - -void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); - -void ips200_init (ips200_type_enum type_select); -//===================================================IPS200 基础函数================================================== +//==================================================定义 IPS200 参数结构体=============================================== -//===================================================IPS200 扩展函数================================================== +//==================================================声明 IPS200 基础函数================================================ +void ips200_clear (void); // IPS200 清屏函数 +void ips200_full (const uint16 color); // IPS200 屏幕填充函数 +void ips200_set_dir (ips200_dir_enum dir); // IPS200 设置显示方向 +void ips200_set_font (ips200_font_size_enum font); // IPS200 设置显示字体 +void ips200_set_color (const uint16 pen, const uint16 bgcolor); // IPS200 设置显示颜色 +void ips200_draw_point (uint16 x, uint16 y, const uint16 color); // IPS200 画点函数 +void ips200_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // IPS200 画线函数 +void ips200_show_char (uint16 x, uint16 y, const char dat); // IPS200 显示字符 +void ips200_show_string (uint16 x, uint16 y, const char dat[]); // IPS200 显示字符串 +void ips200_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // IPS200 显示32位有符号 (去除整数部分无效的0) +void ips200_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // IPS200 显示32位无符号 (去除整数部分无效的0) +void ips200_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // IPS200 显示浮点数 (去除整数部分无效的0) + +void ips200_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // IPS200 显示二值图像 数据每八个点组成一个字节数据 +void ips200_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // IPS200 显示 8bit 灰度图像 带二值化阈值 +void ips200_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // IPS200 显示 RGB565 彩色图像 + +void ips200_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // IPS200 显示波形 +void ips200_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // IPS200 汉字显示 + +void ips200_init (ips200_type_enum type_select); // 2寸 IPS液晶初始化 +//==================================================声明 IPS200 基础函数================================================ + + +//==================================================声明 IPS200 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 IPS200 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -218,9 +217,7 @@ void ips200_init (ips200_type_enum type_select); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define ips200_displayimage8660(p, width, height) (ips200_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================IPS200 扩展函数================================================== - +//==================================================声明 IPS200 扩展函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_key.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_key.c index dbae80b..0495d3f 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_key.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_key.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ static uint32 scanner_period = 0; static uint32 key_press_time[KEY_NUMBER]; // 按键信号持续时长 static key_state_enum key_state[KEY_NUMBER]; // 按键状态 -static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; +static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; // 按键列表 //------------------------------------------------------------------------------------------------------------------- // 函数简介 按键状态扫描 @@ -64,22 +65,26 @@ static const gpio_pin_enum key_index[KEY_NUMBER] = KEY_LIST; void key_scanner (void) { uint8 i = 0; - for(i = 0; i < KEY_NUMBER; i ++) + for(i = 0; KEY_NUMBER > i; i ++) { if(KEY_RELEASE_LEVEL != gpio_get_level(key_index[i])) // 按键按下 { key_press_time[i] ++; - if(key_press_time[i] >= KEY_LONG_PRESS_PERIOD / scanner_period) + if(KEY_LONG_PRESS_PERIOD / scanner_period <= key_press_time[i]) { key_state[i] = KEY_LONG_PRESS; } } else // 按键释放 { - if(key_state[i] != KEY_LONG_PRESS && key_press_time[i] >= KEY_MAX_SHOCK_PERIOD / scanner_period) + if((KEY_LONG_PRESS != key_state[i]) && (KEY_MAX_SHOCK_PERIOD / scanner_period <= key_press_time[i])) { key_state[i] = KEY_SHORT_PRESS; } + else + { + key_state[i] = KEY_RELEASE; + } key_press_time[i] = 0; } } @@ -98,7 +103,7 @@ key_state_enum key_get_state (key_index_enum key_n) } //------------------------------------------------------------------------------------------------------------------- -// 函数简介 清除对应按键状态 +// 函数简介 清除指定按键状态 // 参数说明 key_n 按键索引 // 返回参数 void 无 // 使用示例 key_clear_state(KEY_1); @@ -134,8 +139,8 @@ void key_clear_all_state (void) void key_init (uint32 period) { zf_assert(0 < period); - uint8 loop_temp = 0; - for(loop_temp = 0; loop_temp < KEY_NUMBER; loop_temp ++) + uint8 loop_temp = 0; + for(loop_temp = 0; KEY_NUMBER > loop_temp; loop_temp ++) { gpio_init(key_index[loop_temp], GPI, GPIO_HIGH, GPI_PULL_UP); key_state[loop_temp] = KEY_RELEASE; diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_key.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_key.h index 8390e59..bad1fa7 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_key.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_key.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -50,6 +51,7 @@ #include "zf_common_debug.h" #include "zf_driver_gpio.h" +//==================================================定义 按键 基本配置================================================ // 定义按键引脚 用户可以新增可以修改 默认定义四个按键 // 定义按键顺序对应下方 key_index_enum 枚举体中定义的顺序 // 如果用户可以新增按键 那么需要同步在下方 key_index_enum 枚举体中新增按键 @@ -58,7 +60,10 @@ #define KEY_RELEASE_LEVEL (GPIO_HIGH) // 按键的默认状态 也就是按键释放状态的电平 #define KEY_MAX_SHOCK_PERIOD (10 ) // 按键消抖检测时长 单位毫秒 低于这个时长的信号会被认为是杂波抖动 #define KEY_LONG_PRESS_PERIOD (1000 ) // 最小长按时长 单位毫秒 高于这个时长的信号会被认为是长按动作 +//==================================================定义 按键 基本配置================================================ + +//==================================================定义 按键 参数结构体=============================================== typedef enum { KEY_1, @@ -74,11 +79,15 @@ typedef enum KEY_SHORT_PRESS, // 按键短按状态 KEY_LONG_PRESS, // 按键长按状态 }key_state_enum; +//==================================================定义 按键 参数结构体=============================================== -void key_scanner (void); -key_state_enum key_get_state (key_index_enum key_n); -void key_clear_state (key_index_enum key_n); -void key_clear_all_state (void); -void key_init (uint32 period); + +//==================================================声明 按键 基础函数=============================================== +void key_scanner (void); // 按键状态扫描 +key_state_enum key_get_state (key_index_enum key_n); // 获取按键状态 +void key_clear_state (key_index_enum key_n); // 清除指定按键状态 +void key_clear_all_state (void); // 清除所有按键状态 +void key_init (uint32 period); // 按键初始化 +//==================================================声明 按键 基础函数=============================================== #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mpu6050.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mpu6050.c index 925cd2c..6dd3554 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mpu6050.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mpu6050.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,15 +58,17 @@ #include "zf_driver_soft_iic.h" #include "zf_device_mpu6050.h" -int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) -int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) +int16 mpu6050_gyro_x = 0, mpu6050_gyro_y = 0, mpu6050_gyro_z = 0; // 三轴陀螺仪数据 GYRO (陀螺仪) +int16 mpu6050_acc_x = 0, mpu6050_acc_y = 0, mpu6050_acc_z = 0; // 三轴加速度计数据 ACC (accelerometer 加速度计) #if MPU6050_USE_SOFT_IIC -static soft_iic_info_struct mpu6050_iic_struct; +static soft_iic_info_struct mpu6050_iic_struct; // 定义 mpu6050 IIC通讯结构体 #define mpu6050_write_register(reg, data) (soft_iic_write_8bit_register(&mpu6050_iic_struct, (reg), (data))) #define mpu6050_read_register(reg) (soft_iic_read_8bit_register(&mpu6050_iic_struct, (reg))) #define mpu6050_read_registers(reg, data, len) (soft_iic_read_8bit_registers(&mpu6050_iic_struct, (reg), (data), (len))) +#else +#error "暂不支持硬件IIC通讯" #endif //------------------------------------------------------------------------------------------------------------------- @@ -84,7 +87,7 @@ static uint8 mpu6050_self1_check (void) mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 while(0x07 != dat) { - if(timeout_count ++ > MPU6050_TIMEOUT_COUNT) + if(MPU6050_TIMEOUT_COUNT < timeout_count ++) { return_state = 1; break; @@ -162,8 +165,8 @@ float mpu6050_gyro_transition (int16 gyro_value) float gyro_data = 0; switch(MPU6050_GYR_SAMPLE) { - case 0x00: gyro_data = (float)gyro_value / 131.2f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131 可以转化为带物理单位的数据,单位为:°/s - case 0x08: gyro_data = (float)gyro_value / 65.6f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.5 可以转化为带物理单位的数据,单位为:°/s + case 0x00: gyro_data = (float)gyro_value / 131.0f; break; // 0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以 131 可以转化为带物理单位的数据,单位为:°/s + case 0x08: gyro_data = (float)gyro_value / 65.5f; break; // 0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以 65.5 可以转化为带物理单位的数据,单位为:°/s case 0x10: gyro_data = (float)gyro_value / 32.8f; break; // 0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s case 0x18: gyro_data = (float)gyro_value / 16.4f; break; // 0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s default: break; @@ -202,24 +205,23 @@ uint8 mpu6050_init (void) mpu6050_write_register(MPU6050_PWR_MGMT_1, 0x00); // 解除休眠状态 mpu6050_write_register(MPU6050_SMPLRT_DIV, 0x07); // 125HZ采样率 mpu6050_write_register(MPU6050_CONFIG, 0x04); - mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000°/s - mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g(m/s^2) - mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); - mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); - // MPU6050_GYRO_CONFIG寄存器 - // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s - // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s + mpu6050_write_register(MPU6050_GYRO_CONFIG, MPU6050_GYR_SAMPLE); // 2000 + // GYRO_CONFIG寄存器 + // 设置为:0x00 陀螺仪量程为:±250 dps 获取到的陀螺仪数据除以131.2 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x08 陀螺仪量程为:±500 dps 获取到的陀螺仪数据除以65.6 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x10 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以32.8 可以转化为带物理单位的数据,单位为:°/s + // 设置为:0x18 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以16.4 可以转化为带物理单位的数据,单位为:°/s - // MPU6050_ACCEL_CONFIG寄存器 + mpu6050_write_register(MPU6050_ACCEL_CONFIG, MPU6050_ACC_SAMPLE); // 8g + // ACCEL_CONFIG寄存器 // 设置为:0x00 加速度计量程为:±2g 获取到的加速度计数据 除以16384 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x08 加速度计量程为:±4g 获取到的加速度计数据 除以8192 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x10 加速度计量程为:±8g 获取到的加速度计数据 除以4096 可以转化为带物理单位的数据,单位:g(m/s^2) // 设置为:0x18 加速度计量程为:±16g 获取到的加速度计数据 除以2048 可以转化为带物理单位的数据,单位:g(m/s^2) - + mpu6050_write_register(MPU6050_USER_CONTROL, 0x00); + mpu6050_write_register(MPU6050_INT_PIN_CFG, 0x02); }while(0); return return_state; } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mpu6050.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mpu6050.h index 5b26c2a..32da0fe 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mpu6050.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mpu6050.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -57,6 +58,7 @@ #include "zf_common_typedef.h" +//================================================定义 MPU6050 基本配置================================================ #define MPU6050_USE_SOFT_IIC (1) // 默认使用软件 IIC 方式驱动 建议使用软件 IIC 方式 #if MPU6050_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 IIC 驱动==================================================== @@ -64,9 +66,13 @@ #define MPU6050_SCL_PIN (P20_11) // 软件 IIC SCL 引脚 连接 MPU6050 的 SCL 引脚 #define MPU6050_SDA_PIN (P20_14) // 软件 IIC SDA 引脚 连接 MPU6050 的 SDA 引脚 //====================================================软件 IIC 驱动==================================================== +#else +#error "暂不支持硬件IIC通讯" #endif #define MPU6050_TIMEOUT_COUNT (0x00FF) // MPU6050 超时计数 +//================================================定义 MPU6050 基本配置================================================ + //================================================定义 MPU6050 内部地址================================================ #define MPU6050_DEV_ADDR (0xD0>>1) // IIC写入时的地址字节数据,+1为读取 @@ -96,17 +102,19 @@ //================================================定义 MPU6050 内部地址================================================ -//================================================声明 MPU6050 数据存储变量============================================== -extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) -extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) -//================================================声明 MPU6050 数据存储变量============================================== -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 全局变量================================================ +extern int16 mpu6050_gyro_x, mpu6050_gyro_y, mpu6050_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) +extern int16 mpu6050_acc_x, mpu6050_acc_y, mpu6050_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) +//================================================声明 MPU6050 全局变量================================================ + + +//================================================声明 MPU6050 基础函数================================================ void mpu6050_get_acc (void); // 获取 MPU6050 加速度计数据 void mpu6050_get_gyro (void); // 获取 MPU6050 陀螺仪数据 float mpu6050_acc_transition (int16 acc_value); // 将 MPU6050 加速度计数据转换为实际物理数据 float mpu6050_gyro_transition (int16 gyro_value); // 将 MPU6050 陀螺仪数据转换为实际物理数据 uint8 mpu6050_init (void); // 初始化 MPU6050 -//===================================================MPU6050 基础函数================================================= +//================================================声明 MPU6050 基础函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mt9v03x.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mt9v03x.c index e77e62e..8544616 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mt9v03x.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mt9v03x.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -60,25 +61,24 @@ #include "zf_device_config.h" #include "zf_device_mt9v03x.h" -vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 -IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 +vuint8 mt9v03x_finish_flag = 0; // 一场图像采集完成标志位 +IFX_ALIGN(4) uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 必须4字节对齐 -static m9v03x_type_enum mt9v03x_type; -static uint16 mt9v03x_version = 0x00; +static m9v03x_type_enum mt9v03x_type; // 定义摄像头类型 +static uint16 mt9v03x_version = 0x00; // 定义摄像头版本号 -int16 timeout = MT9V03X_INIT_TIMEOUT; +int16 timeout = MT9V03X_INIT_TIMEOUT; // 定义超时溢出时长 -uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 -uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 -uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 +uint8 mt9v03x_lost_flag = 1; // 图像丢失标志位 +uint8 mt9v03x_dma_int_num; // 当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; // 是否需要重新初始化 uint8 mt9v03x_link_list_num; // 需要配置到摄像头的数据 不允许在这修改参数 static int16 mt9v03x_set_confing_buffer[MT9V03X_CONFIG_FINISH][2]= { {MT9V03X_INIT, 0}, // 摄像头开始初始化 - {MT9V03X_AUTO_EXP, MT9V03X_AUTO_EXP_DEF}, // 自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限 {MT9V03X_EXP_TIME, MT9V03X_EXP_TIME_DEF}, // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 {MT9V03X_FPS, MT9V03X_FPS_DEF}, // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS @@ -115,7 +115,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -127,7 +127,7 @@ static uint8 mt9v03x_set_config (int16 buff[MT9V03X_CONFIG_FINISH][2]) } // 设置参数 具体请参看问题锦集手册 // 开始配置摄像头并重新初始化 - for(; loop_count < MT9V03X_SET_DATA; loop_count --) + for(; MT9V03X_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -169,7 +169,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; @@ -180,9 +180,9 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) default: loop_count = MT9V03X_GAIN; break; } - for(loop_count = loop_count - 1; loop_count >= 1; loop_count --) + for(loop_count = loop_count - 1; 1 <= loop_count; loop_count --) { - if(mt9v03x_version < 0x0230 && buff[loop_count][0] == MT9V03X_PCLK_MODE) + if((0x0230 > mt9v03x_version) && (MT9V03X_PCLK_MODE == buff[loop_count][0])) { continue; } @@ -193,7 +193,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) uart_buffer[3] = (uint8)temp; uart_write_buffer(MT9V03X_COF_UART, uart_buffer, 4); - timeout_count = 0; + timeout_count = 0; do { if(3 <= fifo_used(&camera_receiver_fifo)) @@ -205,7 +205,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(MT9V03X_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > MT9V03X_INIT_TIMEOUT) // 超时 + if(MT9V03X_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -221,7 +221,7 @@ static uint8 mt9v03x_get_config (int16 buff[MT9V03X_CONFIG_FINISH - 1][2]) // 返回参数 void // 使用示例 mt9v03x_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void mt9v03x_uart_callback (void) +static void mt9v03x_uart_handler (void) { uint8 data = 0; uart_query_byte(MT9V03X_COF_UART, &data); @@ -347,11 +347,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_EXP_TIME; temp = light; @@ -374,12 +375,12 @@ uint8 mt9v03x_set_exposure_time (uint16 light) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_exposure_time_sccb(light); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } @@ -396,11 +397,12 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) uint8 return_state = 0; if(MT9V03X_UART == mt9v03x_type) { + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 uart_buffer_index = 0; - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_callback); // 设置连接摄像头类型 + uart_buffer[0] = 0xA5; uart_buffer[1] = MT9V03X_SET_ADDR; temp = addr; @@ -431,16 +433,15 @@ uint8 mt9v03x_set_reg (uint8 addr, uint16 data) { return_state = 1; } + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); } else { return_state = mt9v03x_set_reg_sccb(addr, data); } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 return return_state; } - //------------------------------------------------------------------------------------------------------------------- // 函数简介 MT9V03X 摄像头初始化 // 参数说明 void @@ -454,28 +455,44 @@ uint8 mt9v03x_init (void) soft_iic_info_struct mt9v03x_iic_struct; do { - system_delay_ms(500); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, NULL); // 设置连接摄像头类型 + system_delay_ms(200); // 首先尝试SCCB通讯 mt9v03x_type = MT9V03X_SCCB; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); soft_iic_init(&mt9v03x_iic_struct, 0, MT9V03X_COF_IIC_DELAY, MT9V03X_COF_IIC_SCL, MT9V03X_COF_IIC_SDA); if(mt9v03x_set_config_sccb(&mt9v03x_iic_struct, mt9v03x_set_confing_buffer)) { // SCCB通讯失败,尝试串口通讯 mt9v03x_type = MT9V03X_UART; + set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, mt9v03x_uart_handler); camera_fifo_init(); - set_camera_type(CAMERA_GRAYSCALE, NULL, NULL, mt9v03x_uart_callback); // 设置连接摄像头类型 - uart_init (MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); //初始换串口 配置摄像头 + + // 初始换串口 配置摄像头 + uart_init(MT9V03X_COF_UART, MT9V03X_COF_BAUR, MT9V03X_COF_UART_RX, MT9V03X_COF_UART_TX); uart_rx_interrupt(MT9V03X_COF_UART, 1); fifo_clear(&camera_receiver_fifo); + // 等待摄像头上电初始化成功 方式有两种:延时或者通过获取配置的方式 二选一 + // system_delay_ms(1000); // 延时方式 + + // if(mt9v03x_get_config(mt9v03x_get_confing_buffer)) + // { + // // 如果程序在输出了断言信息 并且提示出错位置在这里 + // // 那么就是串口通信出错并超时退出了 + // // 检查一下接线有没有问题 如果没问题可能就是坏了 + // zf_log(0, "MT9V03X get config error."); + // set_camera_type(NO_CAMERE, NULL, NULL, NULL); + // return_state = 1; + // break; + // } mt9v03x_version = mt9v03x_get_version(); // 获取配置的方式 if(mt9v03x_set_config(mt9v03x_set_confing_buffer)) { // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是通信出错并超时退出了 + // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X set config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; @@ -488,15 +505,14 @@ uint8 mt9v03x_init (void) // 那么就是串口通信出错并超时退出了 // 检查一下接线有没有问题 如果没问题可能就是坏了 zf_log(0, "MT9V03X get config error."); + uart_rx_interrupt(MT9V03X_COF_UART, 0); set_camera_type(NO_CAMERE, NULL, NULL, NULL); return_state = 1; break; } } - set_camera_type(CAMERA_GRAYSCALE, mt9v03x_vsync_handler, mt9v03x_dma_handler, NULL); // 设置连接摄像头类型 mt9v03x_link_list_num = camera_init(MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_IMAGE_SIZE); }while(0); - return return_state; } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mt9v03x.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mt9v03x.h index d6f592b..64c4d69 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mt9v03x.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_mt9v03x.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,7 +54,7 @@ #include "zf_common_typedef.h" #include "zf_device_type.h" -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ #define MT9V03X_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define MT9V03X_COF_BAUR (9600) // 总钻风配置串口波特率 #define MT9V03X_COF_UART_TX (UART1_RX_P02_3) // 总钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,31 +74,32 @@ #define MT9V03X_DATA_ADD (get_port_in_addr(MT9V03X_DATA_PIN)) #define MT9V03X_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================MT9V03X 驱动配置==================================================== +//================================================定义 MT9V03X 基本配置================================================ -//=================================================MT9V03X 参数配置==================================================== + +//================================================定义 MT9V03X 参数配置================================================ #define MT9V03X_W (188) // 图像宽度 范围 [1-752] #define MT9V03X_H (120) // 图像高度 范围 [1-480] #define MT9V03X_IMAGE_SIZE (MT9V03X_W * MT9V03X_H) // 整体图像大小不能超过 65535 -#define MT9V03X_AUTO_EXP_DEF (0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 - // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 - // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 -#define MT9V03X_EXP_TIME_DEF (200) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 -#define MT9V03X_FPS_DEF (50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS -#define MT9V03X_LR_OFFSET_DEF (0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_UD_OFFSET_DEF (0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 - // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 -#define MT9V03X_GAIN_DEF (32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 -#define MT9V03X_PCLK_MODE_DEF (0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] - // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 - // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 -//=================================================MT9V03X 参数配置==================================================== +#define MT9V03X_AUTO_EXP_DEF ( 0 ) // 自动曝光设置 默认不开启自动曝光设置 范围 [0-63] 0为关闭 + // 如果自动曝光开启 EXP_TIME命令设置自动曝光时间的上限 + // 一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光,增加图像稳定性 +#define MT9V03X_EXP_TIME_DEF ( 512 ) // 曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值 +#define MT9V03X_FPS_DEF ( 50 ) // 图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS +#define MT9V03X_LR_OFFSET_DEF ( 0 ) // 图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_UD_OFFSET_DEF ( 0 ) // 图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 + // 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移 +#define MT9V03X_GAIN_DEF ( 32 ) // 图像增益 范围 [16-64] 增益可以在曝光时间固定的情况下改变图像亮暗程度 +#define MT9V03X_PCLK_MODE_DEF ( 0 ) // 像素时钟模式 范围 [0-1] 默认:0 可选参数为:[0:不输出消隐信号,1:输出消隐信号] + // 通常都设置为0,如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1 + // 仅总钻风 MT9V034 V1.5 以及以上版本支持该命令 +//================================================定义 MT9V03X 参数配置================================================ -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== typedef enum { MT9V03X_INIT = 0, // 摄像头初始化命令 @@ -127,18 +129,20 @@ typedef enum MT9V03X_UART, // 通过串口配置参数 MT9V03X_SCCB, // 通过SCCB配置参数 }m9v03x_type_enum; -//==============================================定义 MT9V03X 命令枚举体================================================== +//================================================定义 MT9V03X 参数结构体=============================================== -//==============================================声明 MT9V03X 数据存储变量================================================= + +//================================================声明 MT9V03X 全局变量================================================ extern vuint8 mt9v03x_finish_flag; // 一场图像采集完成标志位 extern uint8 mt9v03x_image[MT9V03X_H][MT9V03X_W]; // 图像数据存储数组 -//==============================================声明 MT9V03X 数据存储变量================================================= +//================================================声明 MT9V03X 全局变量================================================ -//===================================================MT9V03X 基础函数================================================== + +//================================================声明 MT9V03X 基础函数================================================ uint16 mt9v03x_get_version (void); // 获取摄像头固件版本 uint8 mt9v03x_set_exposure_time (uint16 light); // 单独设置摄像头曝光时间 uint8 mt9v03x_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 mt9v03x_init (void); // MT9V03X 摄像头初始化 -//===================================================MT9V03X 基础函数================================================== +//================================================声明 MT9V03X 基础函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_oled.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_oled.c index 0fc0b3b..64739fe 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_oled.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_oled.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -61,8 +62,8 @@ static soft_spi_info_struct oled_spi; #define oled_spi_write_8bit(data) (spi_write_8bit(OLED_SPI, (data))) #endif -static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; -static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; +static oled_dir_enum oled_display_dir = OLED_DEFAULT_DISPLAY_DIR; // 显示方向 +static oled_font_size_enum oled_display_font = OLED_DEFAULT_DISPLAY_FONT; // 显示字体类型 //------------------------------------------------------------------------------------------------------------------- // 函数简介 写8位数据 @@ -98,13 +99,13 @@ static void oled_write_command (const uint8 command) // 使用示例 oled_set_coordinate(x, y); // 备注信息 内部使用用户无需关心 //------------------------------------------------------------------------------------------------------------------- -static void oled_set_coordinate (uint16 x, uint16 y) +static void oled_set_coordinate (uint8 x, uint8 y) { // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); @@ -130,16 +131,19 @@ static void oled_debug_init (void) switch(oled_display_font) { case OLED_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 1; - break; + }break; case OLED_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 2; - break; + }break; case OLED_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = oled_show_string; info.output_screen_clear = oled_clear; @@ -156,15 +160,15 @@ static void oled_debug_init (void) //------------------------------------------------------------------------------------------------------------------- void oled_clear (void) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(0x00); } @@ -181,15 +185,15 @@ void oled_clear (void) //------------------------------------------------------------------------------------------------------------------- void oled_full (const uint8 color) { - uint8 y, x; + uint8 y = 0, x = 0; OLED_CS(0); - for(y = 0; y < 8; y ++) + for(y = 0; 8 > y; y ++) { oled_write_command(0xb0 + y); oled_write_command(0x01); oled_write_command(0x10); - for(x = 0; x < OLED_X_MAX; x ++) + for(x = 0; OLED_X_MAX > x; x ++) { oled_write_data(color); } @@ -239,7 +243,7 @@ void oled_draw_point (uint16 x, uint16 y, const uint8 color) zf_assert(y < 8); OLED_CS(0); - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); oled_write_command(0xb0 + y); oled_write_command(((x & 0xf0) >> 4) | 0x10); oled_write_command((x & 0x0f) | 0x00); @@ -277,7 +281,7 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 6; i ++) { oled_write_data(ascii_font_6x8[c][i]); @@ -292,13 +296,13 @@ void oled_show_string (uint16 x, uint16 y, const char ch[]) x = 0; y ++; } - oled_set_coordinate(x, y); + oled_set_coordinate((uint8)x, (uint8)y); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i]); } - oled_set_coordinate(x, y + 1); + oled_set_coordinate((uint8)x, (uint8)(y + 1)); for(i = 0; i < 8; i ++) { oled_write_data(ascii_font_8x16[c][i + 8]); @@ -329,11 +333,11 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -342,9 +346,10 @@ void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -369,11 +374,11 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -381,9 +386,9 @@ void oled_show_uint (uint16 x,uint16 y,const uint32 dat,uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) { offset *= 10; } @@ -412,13 +417,13 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); + zf_assert(128 > x); + zf_assert(8 > y); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -426,14 +431,12 @@ void oled_show_float (uint16 x,uint16 y,const float dat,uint8 num,uint8 pointnum memset(data_buffer, 0, 17); memset(data_buffer, ' ', num + pointnum + 2); - if(num < 10) + // 用来计算余数显示 123 显示 2 位则应该显示 23 + for(; 0 < num; num --) { - for(; num > 0; num --) - { - offset *= 10; - } - dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; + offset *= 10; } + dat_temp = dat_temp - ((int)dat_temp / (int)offset) * offset; func_float_to_str(data_buffer, dat_temp, pointnum); oled_show_string(x, y, data_buffer); } @@ -456,12 +459,12 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); uint32 i = 0, j = 0, z = 0; - uint8 dat; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -474,7 +477,7 @@ void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 widt for(i = 0; i < dis_width; i += 8) { width_index = i * width / dis_width / 8; - for(z = 0; z < 8; z ++) + for(z = 0; 8 > z; z ++) { dat = 0; if(*(image + height_index * width / 8 + width_index + width / 8 * 0) & (0x80 >> z)) @@ -535,12 +538,12 @@ void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(image != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != image); - int16 i, j; - uint8 dat; + int16 i = 0, j = 0; + uint8 dat = 0; uint32 width_index = 0, height_index = 0; OLED_CS(0); @@ -625,7 +628,9 @@ void oled_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint1 { oled_set_coordinate(x + 0, (uint16)(y + y_temp / 8)); for(x_temp = 0; x_temp < dis_width; x_temp ++) - oled_write_data(0x00); + { + oled_write_data(0x00); + } } for(i = 0; i < dis_width; i ++) { @@ -656,11 +661,11 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf // 如果程序在输出了断言信息 并且提示出错位置在这里 // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 // 检查一下你的显示调用的函数 自己计算一下哪里超过了屏幕显示范围 - zf_assert(x < 128); - zf_assert(y < 8); - zf_assert(chinese_buffer != NULL); + zf_assert(128 > x); + zf_assert(8 > y); + zf_assert(NULL != chinese_buffer); - int16 i, j, k; + int16 i = 0, j = 0, k = 0; OLED_CS(0); for(i = 0; i < number; i ++) @@ -668,7 +673,7 @@ void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buf for(j = 0; j < (size / 8); j ++) { oled_set_coordinate(x + i * size, y + j); - for(k = 0; k < 16; k ++) + for(k = 0; 16 > k; k ++) { oled_write_data(*chinese_buffer); chinese_buffer ++; @@ -697,53 +702,53 @@ void oled_init (void) gpio_init(OLED_CS_PIN , GPO, GPIO_HIGH, GPO_PUSH_PULL); oled_set_dir(oled_display_dir); - oled_debug_init(); OLED_CS(0); OLED_RES(0); system_delay_ms(50); OLED_RES(1); - oled_write_command(0xae); // --turn off oled panel - oled_write_command(0x00); // ---set low column address - oled_write_command(0x10); // ---set high column address - oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) - oled_write_command(0x81); // --set contrast control register - oled_write_command(OLED_BRIGHTNESS); // Set SEG Output Current Brightness + oled_write_command(0xae); // 关闭oled面板 + oled_write_command(0x00); // 设置低列地址 + oled_write_command(0x10); // 设置高列地址 + oled_write_command(0x40); // --set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_write_command(0x81); // 设置对比度控制寄存器 + oled_write_command(OLED_BRIGHTNESS); // 设置SEG输出电流亮度 - if (oled_display_dir == OLED_CROSSWISE) + if(OLED_CROSSWISE == oled_display_dir) { - oled_write_command(0xa1); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc8); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa1); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc8); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } else { - oled_write_command(0xa0); // --Set SEG/Column Mapping 0xa0左右反置 0xa1正常 - oled_write_command(0xc0); // Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 + oled_write_command(0xa0); // 设置 SEG/列 映射 0xa0左右反置 0xa1正常 + oled_write_command(0xc0); // 设置 COM/行扫描方向 0xc0上下反置 0xc8正常 } - oled_write_command(0xa6); // --set normal display - oled_write_command(0xa8); // --set multiplex ratio(1 to 64) - oled_write_command(0x3f); // --1/64 duty - oled_write_command(0xd3); // -set display offset Shift Mapping RAM Counter (0x00~0x3F) - oled_write_command(0x00); // -not offset - oled_write_command(0xd5); // --set display clock divide ratio/oscillator frequency - oled_write_command(0x80); // --set divide ratio, Set Clock as 100 Frames/Sec - oled_write_command(0xd9); // --set pre-charge period - oled_write_command(0xf1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock - oled_write_command(0xda); // --set com pins hardware configuration + oled_write_command(0xa6); // 设置正常显示 + oled_write_command(0xa8); // 设置复用比(1 ~ 64) + oled_write_command(0x3f); // 1/64 占比 + oled_write_command(0xd3); // 设置显示偏移移位映射RAM计数器(0x00~0x3F) + oled_write_command(0x00); // 不偏移 + oled_write_command(0xd5); // 设置显示时钟分频比/振荡器频率 + oled_write_command(0x80); // 设置分割比率,设置时钟为100帧/秒 + oled_write_command(0xd9); // 设定预充期 + oled_write_command(0xf1); // 设置预充为15个时钟,放电为1个时钟 + oled_write_command(0xda); // 设置com引脚硬件配置 oled_write_command(0x12); - oled_write_command(0xdb); // --set vcomh - oled_write_command(0x40); // Set VCOM Deselect Level - oled_write_command(0x20); // -Set Page Addressing Mode (0x00/0x01/0x02) + oled_write_command(0xdb); // 设置 vcomh + oled_write_command(0x40); // 设置VCOM取消选择级别 + oled_write_command(0x20); // 设置页面寻址模式(0x00/0x01/0x02) oled_write_command(0x02); // - oled_write_command(0x8d); // --set Charge Pump enable/disable - oled_write_command(0x14); // --set(0x10) disable - oled_write_command(0xa4); // Disable Entire Display On (0xa4/0xa5) - oled_write_command(0xa6); // Disable Inverse Display On (0xa6/a7) - oled_write_command(0xaf); // --turn on oled panel + oled_write_command(0x8d); // 设置充电泵启用/禁用 + oled_write_command(0x14); // 设置(0 x10)禁用 + oled_write_command(0xa4); // 禁用整个显示打开(0xa4/0xa5) + oled_write_command(0xa6); // 禁用反向显示(0xa6/a7) + oled_write_command(0xaf); // 打开oled面板 OLED_CS(1); oled_clear(); // 初始清屏 - oled_set_coordinate(0, 0); + oled_set_coordinate(0, 0); // OLED显示坐标设置 + oled_debug_init(); // OLED显示DEBUG信息初始化 } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_oled.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_oled.h index e164bff..78c9553 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_oled.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_oled.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,6 +52,7 @@ #include "zf_device_type.h" +//===================================================定义 OLED 基本配置================================================= #define OLED_USE_SOFT_SPI (0 ) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if OLED_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -72,18 +74,19 @@ #define OLED_RES_PIN (P15_1) // 液晶复位引脚定义 #define OLED_DC_PIN (P15_0 ) // 液晶命令位引脚定义 #define OLED_CS_PIN (P15_2 ) // CS 片选引脚 +#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF +#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 +#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 +#define OLED_X_MAX (128) // 屏幕X轴像素最大值 +#define OLED_Y_MAX (64 ) // 屏幕Y轴像素最大值 #define OLED_RES(x) ((x) ? (gpio_high(OLED_RES_PIN)) : (gpio_low(OLED_RES_PIN))) #define OLED_DC(x) ((x) ? (gpio_high(OLED_DC_PIN)) : (gpio_low(OLED_DC_PIN))) #define OLED_CS(x) ((x) ? (gpio_high(OLED_CS_PIN)) : (gpio_low(OLED_CS_PIN))) +//===================================================定义 OLED 基本配置================================================= -#define OLED_BRIGHTNESS (0x7f) // 设置OLED亮度 越大越亮 范围0-0XFF -#define OLED_DEFAULT_DISPLAY_DIR (OLED_CROSSWISE) // 默认的显示方向 -#define OLED_DEFAULT_DISPLAY_FONT (OLED_6X8_FONT ) // 默认的字体模式 -#define OLED_X_MAX (128) -#define OLED_Y_MAX (64 ) -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 参数结构体================================================= typedef enum { OLED_CROSSWISE = 0, // 横屏模式 @@ -96,66 +99,50 @@ typedef enum OLED_8X16_FONT = 1, // 8x16 字体 OLED_16X16_FONT = 2, // 16x16 字体 目前不支持 }oled_font_size_enum; -//=================================================定义 OLED 参数结构体=============================================== +//===================================================定义 OLED 基本配置================================================= -//===================================================OLED 基础函数================================================== -void oled_clear (void); -void oled_full (const uint8 color); -void oled_set_dir (oled_dir_enum dir); -void oled_set_font (oled_font_size_enum font); -void oled_draw_point (uint16 x, uint16 y, const uint8 color); -void oled_show_string (uint16 x, uint16 y, const char ch[]); -void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); -void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); -void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); +//===================================================声明 OLED 基本函数================================================= +void oled_clear (void); // OLED 清屏函数 +void oled_full (const uint8 color); // OLED 屏幕填充函数 +void oled_set_dir (oled_dir_enum dir); // OLED 设置显示方向 +void oled_set_font (oled_font_size_enum font); // OLED 设置显示字体 +void oled_draw_point (uint16 x, uint16 y, const uint8 color); // OLED 画点函数 -void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); +void oled_show_string (uint16 x, uint16 y, const char ch[]); // OLED 显示字符串 +void oled_show_int (uint16 x, uint16 y, const int32 dat, uint8 num); // OLED 显示32位有符号 (去除整数部分无效的0) +void oled_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num); // OLED 显示32位无符号 (去除整数部分无效的0) +void oled_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 pointnum); // OLED 显示浮点数 (去除整数部分无效的0) -void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); -void oled_init (void); -//===================================================OLED 基础函数================================================== +void oled_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // OLED 显示二值图像 数据每八个点组成一个字节数据 +void oled_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // OLED 显示 8bit 灰度图像 带二值化阈值 -//===================================================OLED 扩展函数================================================== +void oled_show_wave (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // OLED 显示波形 +void oled_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number); // OLED 汉字显示 +void oled_init (void); // OLED 初始化函数 +//===================================================定义 OLED 基本函数================================================= + + +//===================================================定义 OLED 扩展配置================================================= //------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示小钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 +// 函数简介 OLED 128*64 显示小钻风图像 +// 参数说明 p 图像数组 // 返回参数 void -// 使用示例 oled_displayimage7725(ov7725_image_binary[0], OV7725_W, OV7725_H); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 +// 使用示例 oled_displayimage7725(ov7725_image_binary[0]); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage7725(p,width,height) (oled_show_binary_image(0, 0, (p), (width), (height), 128, 64)) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x(mt9v03x_image[0], MT9V03X_W, MT9V03X_H, 100); -// 备注信息 拓展的一键显示函数,默认缩放至64x128显示 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x(p,width,height,x) (oled_show_gray_image(0, 0, (p), (width), (height), 128, 64, (x))) -//------------------------------------------------------------------------------------------------------------------- -// 函数简介 OLED 显示总钻风图像 -// 参数说明 p 图像数组指针 -// 参数说明 width 图像实际宽度 -// 参数说明 height 图像实际高度 -// 参数说明 dis_width 图像缩放宽度 -// 参数说明 dis_height 图像缩放高度 -// 参数说明 x 对比度(OLED屏幕无法显示灰度,必须二值化) -// 返回参数 void -// 使用示例 oled_displayimage03x_zoom(mt9v03x_image[0], 78, 50, 100); -// 备注信息 拓展的一键显示函数,用户可以自定义缩放后显示的图像大小 -//------------------------------------------------------------------------------------------------------------------- -#define oled_displayimage03x_zoom(p,width,height,dis_width,dis_height,x) (oled_show_gray_image(0, 0, (p), (width), (height), (dis_width,) (dis_height), (x))) - -//===================================================OLED 扩展函数================================================== +#define oled_displayimage7725(p) (oled_show_binary_image(0, 0, (p), OV7725_W, OV7725_H, 128, 64)) +//------------------------------------------------------------------------------------------------------------------- +// 函数简介 OLED 128*64 显示总钻风图像 带二值化 +// 参数说明 p 图像数组 +// 参数说明 x 二值化显示阈值 +// 返回参数 void +// 使用示例 oled_displayimage03x(mt9v03x_image[0], 127); +// 备注信息 +//------------------------------------------------------------------------------------------------------------------- +#define oled_displayimage03x(p,x) (oled_show_gray_image(0, 0, (p), MT9V03X_W, MT9V03X_H, 128, 64, (x))) +//===================================================定义 OLED 扩展配置================================================= #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ov7725.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ov7725.c index 9e07da1..cfac954 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ov7725.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ov7725.c @@ -101,12 +101,12 @@ static uint8 ov7725_set_config (uint16 buff[OV7725_CONFIG_FINISH][2]) { uint8 return_state = 1; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW; loop_count < OV7725_SET_DATA; loop_count --) + for(loop_count = OV7725_ROW; OV7725_SET_DATA > loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = (uint8)buff[loop_count][0]; @@ -149,12 +149,12 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) { uint8 return_state = 0; uint8 uart_buffer[4]; - uint16 temp; + uint16 temp = 0; uint16 timeout_count = 0; uint32 loop_count = 0; uint32 uart_buffer_index = 0; - for(loop_count = OV7725_ROW - 1; loop_count >= 1; loop_count --) + for(loop_count = OV7725_ROW - 1; 1 <= loop_count; loop_count --) { uart_buffer[0] = 0xA5; uart_buffer[1] = OV7725_GET_STATUS; @@ -178,7 +178,7 @@ static uint8 ov7725_get_config (uint16 buff[OV7725_CONFIG_FINISH - 1][2]) } system_delay_ms(1); }while(OV7725_INIT_TIMEOUT > timeout_count ++); - if(timeout_count > OV7725_INIT_TIMEOUT) // 超时 + if(OV7725_INIT_TIMEOUT < timeout_count) // 超时 { return_state = 1; break; @@ -210,7 +210,7 @@ static uint8 ov7725_iic_init (void) do { ov7725_idcode = soft_iic_sccb_read_register(&ov7725_iic_struct, OV7725_VER); - if( ov7725_idcode != OV7725_ID ) + if(OV7725_ID != ov7725_idcode) { return_state = 1; // 校验摄像头ID号 break; @@ -312,7 +312,7 @@ static uint8 ov7725_iic_init (void) // 返回参数 void // 使用示例 ov7725_uart_callback(); //------------------------------------------------------------------------------------------------------------------- -static void ov7725_uart_callback (void) +static void ov7725_uart_handler (void) { uint8 data = 0; uart_query_byte(OV7725_COF_UART, &data); @@ -394,7 +394,7 @@ static void ov7725_dma_handler(void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_uart_get_id (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -433,7 +433,7 @@ uint16 ov7725_uart_get_id (void) //------------------------------------------------------------------------------------------------------------------- uint16 ov7725_get_version (void) { - uint16 temp; + uint16 temp = 0; uint8 uart_buffer[4]; uint16 timeout_count = 0; uint16 return_value = 0; @@ -470,72 +470,78 @@ uint16 ov7725_get_version (void) //------------------------------------------------------------------------------------------------------------------- uint8 ov7725_init (void) { - uint8 num = 0; + uint16 out_time = 0; uint8 return_state = 0; gpio_init(OV7725_VSYNC_PORT_PIN, GPI, GPIO_LOW, GPI_FLOATING_IN); - while(!num) + do { - num = gpio_get_level(OV7725_VSYNC_PORT_PIN); - system_delay_ms(1); - } + while(0 == gpio_get_level(OV7725_VSYNC_PORT_PIN)) + { + system_delay_ms(1); + out_time ++; + if(OV7725_INIT_TIMEOUT < out_time) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那大概率没有正确连接小钻风摄像头 + // 检查一下接线和供电有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 check error."); + return_state = 1; + break; + } + } + set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); + camera_fifo_init(); - if(0 == return_state) - { uart_init(OV7725_COF_UART, OV7725_COF_BAUR, OV7725_COF_UART_RX, OV7725_COF_UART_TX); uart_rx_interrupt(OV7725_COF_UART, 1); system_delay_ms(200); - set_camera_type(CAMERA_BIN_UART, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - camera_fifo_init(); - do + // 获取所有参数 + if(ov7725_get_config(ov7725_get_confing_buffer)) { + uart_rx_interrupt(OV7725_COF_UART, 0); + system_delay_ms(200); + set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_handler); // 设置连接摄像头类型 + if(ov7725_iic_init()) + { + zf_log(0, "OV7725 IIC error."); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + zf_log(0, "ov7725 set config error."); + break; + } + } + else + { + // 设置所有参数 + if(ov7725_set_config(ov7725_set_confing_buffer)) + { + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 set confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; + } // 获取所有参数 if(ov7725_get_config(ov7725_get_confing_buffer)) { - set_camera_type(CAMERA_BIN_IIC, ov7725_vsync_handler, ov7725_dma_handler, ov7725_uart_callback); // 设置连接摄像头类型 - if(ov7725_iic_init()) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是 IIC 出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } + // 如果程序在输出了断言信息 并且提示出错位置在这里 + // 那么就是串口通信出错并超时退出了 + // 检查一下接线有没有问题 如果没问题可能就是坏了 + zf_log(0, "OV7725 get confing error."); + uart_rx_interrupt(OV7725_COF_UART, 0); + set_camera_type(NO_CAMERE, NULL, NULL, NULL); + return_state = 1; + break; } - else - { - // 设置所有参数 - if(ov7725_set_config(ov7725_set_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - - // 获取所有参数 - if(ov7725_get_config(ov7725_get_confing_buffer)) - { - set_camera_type(NO_CAMERE, NULL, NULL, NULL); - return_state = 1; - // 如果程序在输出了断言信息 并且提示出错位置在这里 - // 那么就是串口通信出错并超时退出了 - // 检查一下接线有没有问题 如果没问题可能就是坏了 - zf_log(0, "ov7725 set config error."); - break; - } - } - ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); - }while(0); - } - + } + ov7725_link_list_num = camera_init(OV7725_DATA_ADD, ov7725_image_binary[0], OV7725_IMAGE_SIZE); + }while(0); return return_state; } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ov7725.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ov7725.h index d424e1b..ed46ae5 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ov7725.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ov7725.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ #define OV7725_COF_UART (UART_1) // 小钻风配置串口 #define OV7725_COF_BAUR (9600) // 小钻风配置串口波特率 #define OV7725_COF_UART_TX (UART1_RX_P02_3) // 小钻风 UART-TX 引脚 要接在单片机 RX 上 @@ -73,18 +74,20 @@ #define OV7725_DATA_ADD get_port_in_addr(OV7725_DATA_PIN) #define OV7725_INIT_TIMEOUT (0x0080) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================OV7725 驱动配置==================================================== +//================================================定义 OV7725 基本配置================================================ -//=================================================OV7725 参数配置==================================================== + +//================================================定义 OV7725 参数配置================================================ #define OV7725_W (160) // 图像宽度 80/160/240/320 #define OV7725_H (120) // 图像高度 60/120/180/240 #define OV7725_IMAGE_SIZE (OV7725_W * OV7725_H / 8) // 整体图像大小 OV7725_IMAGE_SIZE 不能超过 65535 #define OV7725_CONTRAST_DEF (0x30) // 阈值设置 摄像头二值化阈值 过大和过小的数值会被摄像头自动修正 #define OV7725_FPS_DEF (50 ) // 帧率设置 最高 150 帧 但最小分辨率才能达到最高帧率 -//=================================================OV7725 参数配置==================================================== +//================================================定义 OV7725 参数配置================================================ -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ + +//==============================================定义 OV7725 IIC 内部地址============================================== #define OV7725_ID (0x21) // 摄像头ID号 #define OV7725_GAIN (0x00) // 以下为摄像头寄存器 #define OV7725_BLUE (0x01) @@ -235,9 +238,10 @@ #define OV7725_SIGN (0xAB) #define OV7725_DSPAuto (0xAC) #define OV7725_DEV_ADD (0x42 >> 1) -//==========================================IIC 版本小钻风寄存器 本部分不允许用户更改============================================ +//==============================================定义 OV7725 IIC 内部地址============================================== -//==============================================定义 OV7725 命令枚举体================================================== + +//===============================================定义 OV7725 参数结构体================================================ typedef enum { OV7725_INIT = 0x00, @@ -255,18 +259,20 @@ typedef enum OV7725_SET_ADDR = 0xFE, OV7725_SET_DATA = 0xFF, }ov7725_cmd_enum; -//==============================================定义 OV7725 命令枚举体================================================== +//===============================================定义 OV7725 参数结构体================================================ -//==============================================声明 OV7725 数据存储变量================================================= + +//===============================================声明 OV7725 全局变量================================================= extern vuint8 ov7725_finish_flag; // 一场图像采集完成标志位 extern uint8 ov7725_image_binary[OV7725_H][OV7725_W / 8]; // 图像保存数组 -//==============================================声明 OV7725 数据存储变量================================================= +//===============================================声明 OV7725 全局变量================================================= -//=================================================OV7725 基础函数=================================================== + +//===============================================声明 OV7725 基础函数================================================= uint16 ov7725_uart_get_id (void); // 获取摄像头固件 ID uint16 ov7725_get_version (void); // 获取摄像头固件版本 uint8 ov7725_init (void); // OV7725 摄像头初始化 -//=================================================OV7725 基础函数=================================================== +//===============================================声明 OV7725 基础函数================================================= #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_scc8660.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_scc8660.h index 3bd82cd..9ef3219 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_scc8660.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_scc8660.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -52,7 +53,7 @@ #include "zf_device_type.h" -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ #define SCC8660_COF_UART (UART_1) // 配置摄像头所使用到的串口 #define SCC8660_COF_BAUR (9600 ) // 凌瞳 配置串口波特率 #define SCC8660_COF_UART_TX (UART1_RX_P02_3) // 凌瞳 UART-TX 引脚 要接在单片机 RX 上 @@ -68,9 +69,9 @@ #define SCC8660_DATA_ADD (get_port_in_addr(SCC8660_DATA_PIN)) #define SCC8660_INIT_TIMEOUT (0x00F0) // 默认的摄像头初始化超时时间 毫秒为单位 -//=================================================SCC8660 驱动配置==================================================== +//================================================定义 SCC8660 基本配置================================================ -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ #define SCC8660_W (160) // 实际图像分辨率宽度 可选参数为:160 180 #define SCC8660_H (120) // 实际图像分辨率高度 可选参数为:120 160 #define SCC8660_IMAGE_SIZE (SCC8660_W * 2 * SCC8660_H) // 整体图像大小 SCC8660_W*2*SCC8660_H 不能超过 65535 @@ -86,9 +87,9 @@ #define SCC8660_COLOR_MODE_DEF (1 ) // 图像色彩模式 默认:0 可选参数为:[0,1] 0:正常彩色模式 1:鲜艳模式(色彩饱和度提高) #define SCC8660_DATA_FORMAT_DEF (1 ) // 输出数据格式 默认:0 可选参数为:[0-3] 0:RGB565 1:RGB565(字节交换) 2:YUV422(YUYV) 3:YUV422(UYVY) #define SCC8660_MANUAL_WB_DEF (0 ) // 手动白平衡 默认:0 可选参数为:[0,0x65-0xa0] 0:关闭手动白平衡,启用自动白平衡 其他:手动白平衡 手动白平衡时 参数范围0x65-0xa0 -//=================================================SCC8660 参数配置==================================================== +//================================================定义 SCC8660 参数配置================================================ -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ typedef enum { SCC8660_INIT = 0x00, // 摄像头初始化命令 @@ -113,14 +114,14 @@ typedef enum SCC8660_SET_REG_ADDR = 0xFE, SCC8660_SET_REG_DATA = 0xFF, }scc8660_cmd_enum; -//==============================================定义 SCC8660 命令枚举体================================================== +//===============================================定义 SCC8660 参数结构体================================================ -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= extern vuint8 scc8660_finish_flag; // 一场图像采集完成标志位 extern uint16 scc8660_image[SCC8660_H][SCC8660_W]; // 图像保存数组 -//==============================================声明 SCC8660 数据存储变量================================================= +//===============================================声明 SCC8660 全局变量================================================= -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= uint16 scc8660_get_id (void); // 获取摄像头 ID uint16 scc8660_get_parameter (uint16 config); // 单独设置摄像头曝光时间 uint16 scc8660_get_version (void); // 获取彩色摄像头固件版本 @@ -128,6 +129,6 @@ uint8 scc8660_set_bright (uint16 data); uint8 scc8660_set_white_balance (uint16 data); // 单独设置白平衡 uint8 scc8660_set_reg (uint8 addr, uint16 data); // 对摄像头内部寄存器进行写操作 uint8 scc8660_init (void); // SCC8660 摄像头初始化 -//=================================================SCC8660 基础函数=================================================== +//===============================================声明 SCC8660 基础函数================================================= #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tft180.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tft180.c index 5187013..83c5588 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tft180.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tft180.c @@ -56,14 +56,14 @@ #include "zf_driver_spi.h" #include "zf_device_tft180.h" -static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; -static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; +static uint16 tft180_pencolor = TFT180_DEFAULT_PENCOLOR; // 画笔颜色(字体色) +static uint16 tft180_bgcolor = TFT180_DEFAULT_BGCOLOR; // 背景颜色 -static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; -static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; +static tft180_dir_enum tft180_display_dir = TFT180_DEFAULT_DISPLAY_DIR; // 显示方向 +static tft180_font_size_enum tft180_display_font = TFT180_DEFAULT_DISPLAY_FONT; // 显示字体类型 -static uint8 tft180_x_max = 160; -static uint8 tft180_y_max = 128; +static uint8 tft180_x_max = 160; // 屏幕X轴像素最大值 +static uint8 tft180_y_max = 128; // 屏幕Y轴像素最大值 #if TFT180_USE_SOFT_SPI static soft_spi_info_struct tft180_spi; @@ -138,33 +138,38 @@ static void tft180_set_region (uint16 x1, uint16 y1, uint16 x2, uint16 y2) zf_assert(x2 < tft180_x_max); zf_assert(y2 < tft180_y_max); - if(tft180_display_dir == TFT180_PORTAIT || tft180_display_dir == TFT180_PORTAIT_180) + switch(tft180_display_dir) { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x2 + 2); + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x2 + 2); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 1); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 1); - } - else - { - tft180_write_index(0x2a); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(x1 + 1); - tft180_write_8bit_data(0x0); - tft180_write_8bit_data(x2 + 1); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 1); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 1); + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_write_index(0x2a); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(x1 + 1); + tft180_write_8bit_data(0x0); + tft180_write_8bit_data(x2 + 1); - tft180_write_index(0x2b); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y1 + 2); - tft180_write_8bit_data(0x00); - tft180_write_8bit_data(y2 + 2); + tft180_write_index(0x2b); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y1 + 2); + tft180_write_8bit_data(0x00); + tft180_write_8bit_data(y2 + 2); + }break; } tft180_write_index(0x2c); } @@ -188,20 +193,23 @@ static void tft180_debug_init(void) switch(tft180_display_font) { case TFT180_6X8_FONT: + { info.font_x_size = 6; info.font_y_size = 8; - break; + }break; case TFT180_8X16_FONT: + { info.font_x_size = 8; info.font_y_size = 16; - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } info.output_screen = tft180_show_string; info.output_screen_clear = tft180_clear; - + debug_output_init(&info); } @@ -218,7 +226,7 @@ void tft180_clear (void) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(tft180_bgcolor); } @@ -238,7 +246,7 @@ void tft180_full (const uint16 color) TFT180_CS(0); tft180_set_region(0, 0, tft180_x_max - 1, tft180_y_max - 1); - for( ; i > 0; i --) + for( ; 0 < i; i --) { tft180_write_16bit_data(color); } @@ -255,15 +263,20 @@ void tft180_full (const uint16 color) void tft180_set_dir (tft180_dir_enum dir) { tft180_display_dir = dir; - if(dir < 2) + switch(tft180_display_dir) { - tft180_x_max = 128; - tft180_y_max = 160; - } - else - { - tft180_x_max = 160; - tft180_y_max = 128; + case TFT180_PORTAIT: + case TFT180_PORTAIT_180: + { + tft180_x_max = 128; + tft180_y_max = 160; + }break; + case TFT180_CROSSWISE: + case TFT180_CROSSWISE_180: + { + tft180_x_max = 160; + tft180_y_max = 128; + }break; } } @@ -339,39 +352,42 @@ void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en int16 y_dir = (y_start < y_end ? 1 : -1); float temp_rate = 0; float temp_b = 0; - if(x_start != x_end) + do { - temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); - temp_b = (float)y_start - (float)x_start * temp_rate; - } - else - { - while(y_start != y_end) + if(x_start != x_end) { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; + temp_rate = (float)(y_start - y_end) / (float)(x_start - x_end); + temp_b = (float)y_start - (float)x_start * temp_rate; } - return; - } - - if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) - { - while(y_start != y_end) + else { - tft180_draw_point(x_start, y_start, color); - y_start += y_dir; - x_start = (int16)(((float)y_start - temp_b) / temp_rate); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + } + break; } - } - else - { - while(x_start != x_end) + + if(func_abs(y_start - y_end) > func_abs(x_start - x_end)) { - tft180_draw_point(x_start, y_start, color); - x_start += x_dir; - y_start = (int16)((float)x_start * temp_rate + temp_b); + while(y_start != y_end) + { + tft180_draw_point(x_start, y_start, color); + y_start += y_dir; + x_start = (int16)(((float)y_start - temp_b) / temp_rate); + } } - } + else + { + while(x_start != x_end) + { + tft180_draw_point(x_start, y_start, color); + x_start += x_dir; + y_start = (int16)((float)x_start * temp_rate + temp_b); + } + } + }while(0); } //------------------------------------------------------------------------------------------------------------------- @@ -390,18 +406,19 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - uint8 i,j; + uint8 i = 0, j = 0; TFT180_CS(0); switch(tft180_display_font) { case TFT180_6X8_FONT: - for(i = 0; i < 6; i ++) + { + for(i = 0; 6 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 8); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_6x8[dat - 32][i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -414,15 +431,16 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_top >>= 1; } } - break; + }break; case TFT180_8X16_FONT: - for(i = 0; i < 8; i ++) + { + for(i = 0; 8 > i; i ++) { tft180_set_region(x + i, y, x + i, y + 15); // 减 32 因为是取模是从空格开始取得 空格在 ascii 中序号是 32 uint8 temp_top = ascii_font_8x16[dat - 32][i]; uint8 temp_bottom = ascii_font_8x16[dat - 32][i + 8]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_top & 0x01) { @@ -434,7 +452,7 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) } temp_top >>= 1; } - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if(temp_bottom & 0x01) { @@ -447,10 +465,11 @@ void tft180_show_char (uint16 x, uint16 y, const char dat) temp_bottom >>= 1; } } - break; + }break; case TFT180_16X16_FONT: + { // 暂不支持 - break; + }break; } TFT180_CS(1); } @@ -472,22 +491,15 @@ void tft180_show_string (uint16 x, uint16 y, const char dat[]) zf_assert(y < tft180_y_max); uint16 j = 0; - while(dat[j] != '\0') + while('\0' != dat[j]) { switch(tft180_display_font) { - case TFT180_6X8_FONT: - tft180_show_char(x + 6 * j, y, dat[j]); - j ++; - break; - case TFT180_8X16_FONT: - tft180_show_char(x + 8 * j, y, dat[j]); - j ++; - break; - case TFT180_16X16_FONT: - // 暂不支持 - break; + case TFT180_6X8_FONT: tft180_show_char(x + 6 * j, y, dat[j]); break; + case TFT180_8X16_FONT: tft180_show_char(x + 8 * j, y, dat[j]); break; + case TFT180_16X16_FONT: break; // 暂不支持 } + j ++; } } @@ -507,8 +519,8 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); int32 dat_temp = dat; int32 offset = 1; @@ -517,10 +529,12 @@ void tft180_show_int (uint16 x, uint16 y, const int32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num + 1); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_int_to_str(data_buffer, dat_temp); @@ -543,8 +557,8 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 10); + zf_assert(0 < num); + zf_assert(10 >= num); uint32 dat_temp = dat; int32 offset = 1; @@ -552,10 +566,12 @@ void tft180_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num) memset(data_buffer, 0, 12); memset(data_buffer, ' ', num); - if(num < 10) + if(10 > num) { - for(; num > 0; num --) + for(; 0 < num; num --) + { offset *= 10; + } dat_temp %= offset; } func_uint_to_str(data_buffer, dat_temp); @@ -582,10 +598,10 @@ void tft180_show_float (uint16 x, uint16 y, const float dat, uint8 num, uint8 po // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(num > 0); - zf_assert(num <= 8); - zf_assert(pointnum > 0); - zf_assert(pointnum <= 6); + zf_assert(0 < num); + zf_assert(8 >= num); + zf_assert(0 < pointnum); + zf_assert(6 >= pointnum); float dat_temp = dat; float offset = 1.0; @@ -659,7 +675,10 @@ void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 wi // 参数说明 threshold 二值化显示阈值 0-不开启二值化 // 返回参数 void // 使用示例 tft180_show_gray_image(0, 0, mt9v03x_image[0], MT9V03X_W, MT9V03X_H, MT9V03X_W / 2, MT9V03X_H / 2, 0); -// 备注信息 +// 备注信息 用于显示总钻风的图像 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 +// 如果要显示二值化图像 直接修改最后一个参数为需要的二值化阈值即可 //------------------------------------------------------------------------------------------------------------------- void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold) { @@ -667,7 +686,7 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0,temp = 0; @@ -691,9 +710,13 @@ void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 widt tft180_write_16bit_data(color); } else if(temp < threshold) + { tft180_write_16bit_data(RGB565_BLACK); + } else + { tft180_write_16bit_data(RGB565_WHITE); + } } } TFT180_CS(1); @@ -719,7 +742,7 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(image != NULL); + zf_assert(NULL != image); uint32 i = 0, j = 0; uint16 color = 0; @@ -736,7 +759,9 @@ void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w width_index = i * width / dis_width; color = *(image + height_index * width + width_index); // 读取像素点 if(color_mode) + { color = ((color & 0xff) << 8) | (color >> 8); + } tft180_write_16bit_data(color); } } @@ -762,7 +787,7 @@ void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uin // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(wave != NULL); + zf_assert(NULL != wave); uint32 i = 0, j = 0; uint32 width_index = 0, value_max_index = 0; @@ -804,11 +829,11 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b // 那么一般是屏幕显示的时候超过屏幕分辨率范围了 zf_assert(x < tft180_x_max); zf_assert(y < tft180_y_max); - zf_assert(chinese_buffer != NULL); + zf_assert(NULL != chinese_buffer); - int i, j, k; - uint8 temp, temp1, temp2; - const uint8 *p_data; + int i = 0, j = 0, k = 0; + uint8 temp = 0, temp1 = 0, temp2 = 0; + const uint8 *p_data = chinese_buffer; temp2 = size / 8; @@ -823,11 +848,17 @@ void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b { for(k = 0; k < temp2; k ++) { - for(j = 8; j > 0; j --) + for(j = 8; 0 < j; j --) { temp = (*p_data >> (j - 1)) & 0x01; - if(temp) tft180_write_16bit_data(color); - else tft180_write_16bit_data(tft180_bgcolor); + if(temp) + { + tft180_write_16bit_data(color); + } + else + { + tft180_write_16bit_data(tft180_bgcolor); + } } p_data ++; } @@ -859,7 +890,6 @@ void tft180_init (void) tft180_set_dir(tft180_display_dir); tft180_set_color(tft180_pencolor, tft180_bgcolor); - tft180_debug_init(); TFT180_RST(0); system_delay_ms(10); @@ -916,10 +946,10 @@ void tft180_init (void) tft180_write_index(0x36); switch(tft180_display_dir) // y x v { - case 0: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; // 竖屏模式 - case 1: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; // 竖屏模式 旋转180 - case 2: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; // 横屏模式 - case 3: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; // 横屏模式 旋转180 + case TFT180_PORTAIT: tft180_write_8bit_data(1<<7 | 1<<6 | 0<<5); break; + case TFT180_PORTAIT_180: tft180_write_8bit_data(0<<7 | 0<<6 | 0<<5); break; + case TFT180_CROSSWISE: tft180_write_8bit_data(1<<7 | 0<<6 | 1<<5); break; + case TFT180_CROSSWISE_180: tft180_write_8bit_data(0<<7 | 1<<6 | 1<<5); break; } tft180_write_index(0xe0); @@ -981,4 +1011,5 @@ void tft180_init (void) TFT180_CS(1); tft180_clear(); + tft180_debug_init(); } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tft180.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tft180.h index f1c3b9c..f9d98c7 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tft180.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tft180.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -53,6 +54,7 @@ #include "zf_device_type.h" +//=================================================定义 TFT180 基本配置================================================ #define TFT180_USE_SOFT_SPI (0) // 默认使用硬件 SPI 方式驱动 建议使用硬件 SPI 方式驱动 #if TFT180_USE_SOFT_SPI // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 //====================================================软件 SPI 驱动==================================================== @@ -84,6 +86,8 @@ #define TFT180_RST(x) ((x) ? (gpio_high(TFT180_RES_PIN)) : (gpio_low(TFT180_RES_PIN))) #define TFT180_CS(x) ((x) ? (gpio_high(TFT180_CS_PIN)) : (gpio_low(TFT180_CS_PIN))) #define TFT180_BLK(x) ((x) ? (gpio_high(TFT180_BL_PIN)) : (gpio_low(TFT180_BL_PIN))) +//=================================================定义 TFT180 基本配置================================================ + //=================================================定义 TFT180 参数结构体=============================================== typedef enum @@ -102,32 +106,34 @@ typedef enum }tft180_font_size_enum; //=================================================定义 TFT180 参数结构体=============================================== -//===================================================TFT180 基础函数================================================== -void tft180_clear (void); -void tft180_full (const uint16 color); -void tft180_set_dir (tft180_dir_enum dir); -void tft180_set_font (tft180_font_size_enum font); -void tft180_set_color (const uint16 pen, const uint16 bgcolor); -void tft180_draw_point (uint16 x, uint16 y, const uint16 color); -void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); -void tft180_show_char (uint16 x, uint16 y, const char dat); -void tft180_show_string (uint16 x, uint16 y, const char dat[]); -void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); -void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); -void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); +//=================================================声明 TFT180 基础函数================================================ +void tft180_clear (void); // TFT180 清屏函数 +void tft180_full (const uint16 color); // TFT180 屏幕填充函数 +void tft180_set_dir (tft180_dir_enum dir); // TFT180 设置显示方向 +void tft180_set_font (tft180_font_size_enum font); // TFT180 设置显示字体 +void tft180_set_color (const uint16 pen, const uint16 bgcolor); // TFT180 设置显示颜色 +void tft180_draw_point (uint16 x, uint16 y, const uint16 color); // TFT180 画点函数 +void tft180_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color); // TFT180 画线函数 -void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); -void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); +void tft180_show_char (uint16 x, uint16 y, const char dat); // TFT180 显示字符 +void tft180_show_string (uint16 x, uint16 y, const char dat[]); // TFT180 显示字符串 +void tft180_show_int (uint16 x,uint16 y, const int32 dat, uint8 num); // TFT180 显示32位有符号 (去除整数部分无效的0) +void tft180_show_uint (uint16 x,uint16 y, const uint32 dat, uint8 num); // TFT180 显示32位无符号 (去除整数部分无效的0) +void tft180_show_float (uint16 x,uint16 y, const float dat, uint8 num, uint8 pointnum); // TFT180 显示浮点数 (去除整数部分无效的0) -void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); -void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); +void tft180_show_binary_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); // TFT180 显示二值图像 数据每八个点组成一个字节数据 +void tft180_show_gray_image (uint16 x, uint16 y, const uint8 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 threshold); // TFT180 显示 8bit 灰度图像 带二值化阈值 +void tft180_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height, uint8 color_mode); // TFT180 显示 RGB565 彩色图像 +void tft180_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max); // TFT180 显示波形 +void tft180_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_buffer, uint8 number, const uint16 color); // TFT180 汉字显示 + // 1.8寸TFT屏幕初始化 void tft180_init (void); -//===================================================TFT180 基础函数================================================== +//=================================================声明 TFT180 基础函数================================================ -//===================================================TFT180 扩展函数================================================== + +//=================================================声明 TFT180 扩展函数================================================ //------------------------------------------------------------------------------------------------------------------- // 函数简介 TFT180 显示小钻风图像 // 参数说明 p 图像数组指针 @@ -158,8 +164,7 @@ void tft180_init (void); // 备注信息 拓展的一键显示函数,默认无缩放,从屏幕坐标起始点开始显示 //------------------------------------------------------------------------------------------------------------------- #define tft180_displayimage8660(p, width, height) (tft180_show_rgb565_image(0, 0, (p), SCC8660_W, SCC8660_H, (width), (height), 1)) - -//===================================================TFT180 扩展函数================================================== +//=================================================声明 TFT180 扩展函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tsl1401.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tsl1401.c index 3688ce9..959fe8a 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tsl1401.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tsl1401.c @@ -54,7 +54,7 @@ uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 -static uint8 tsl1401_init_state = 0; +static uint8 tsl1401_init_state = 0; // TSL1401 初始化标志位 vuint8 tsl1401_finish_flag; // TSL1401 数据准备就绪标志位 //------------------------------------------------------------------------------------------------------------------- diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tsl1401.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tsl1401.h index 0af9380..dbe752e 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tsl1401.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_tsl1401.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,7 +50,7 @@ #include "zf_device_type.h" -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ #define TSL1401_AO_PIN (ADC0_CH4_A4) // 对应第一个 TSL1401 的 AO 引脚 #define TSL1401_AO_PIN1 (ADC0_CH5_A5) // 对应第二个 TSL1401 的 AO 引脚 // TSL1401 的控制引脚定义 多个 TSL1401 建议将控制引脚直接并联 @@ -63,20 +64,20 @@ #define TSL1401_PIT_INDEX (CCU61_CH1) // 使用周期中断 #define TSL1401_AD_RESOLUTION (ADC_8BIT) // ADC 精度 8bit #define TSL1401_DATA_LEN (128 ) // TSL1401 数据长度 -//=================================================TSL1401 驱动配置==================================================== +//=================================================定义 TSL1401 基本配置================================================ -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= extern uint16 tsl1401_data[2][TSL1401_DATA_LEN]; // TSL1401 数据存放数组 extern vuint8 tsl1401_finish_flag; // TSL1401 数据采集完成标志 -//==============================================声明 TSL1401 数据存储变量================================================= +//=================================================声明 TSL1401 全局变量================================================= -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= void tsl1401_collect_pit_handler (void); // TSL1401 线阵 CCD 数据采集 void tsl1401_send_data (uart_index_enum uart_n, uint8 index); // TSL1401 线阵 CCD 图像发送至上位机查看图像 void tsl1401_init (void); // TSL1401 线阵 CCD 初始化 -//=================================================TSL1401 基础函数=================================================== +//=================================================声明 TSL1401 基础函数================================================= #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_type.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_type.c index 9baf8fa..8c086cf 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_type.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_type.c @@ -38,9 +38,9 @@ static void type_default_callback(void); camera_type_enum camera_type = NO_CAMERE; // 摄像头类型变量 -callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 -callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_uart_handler = type_default_callback; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_vsync_handler = type_default_callback; // 场中断函数指针,根据初始化时设置的函数进行跳转 +callback_function camera_dma_handler = type_default_callback; // DMA完成中断函数指针,根据初始化时设置的函数进行跳转 wireless_type_enum wireless_type = NO_WIRELESS; callback_function wireless_module_uart_handler = type_default_callback; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -49,7 +49,7 @@ callback_function wireless_module_uart_handler = type_default_callback; // 函数简介 默认回调函数 // 参数说明 void // 返回参数 void -// 使用示例 type_default_callback(); +// 使用示例 // 备注信息 保护性冗余设计 防止在没有初始化设备的时候跑飞 //------------------------------------------------------------------------------------------------------------------- static void type_default_callback (void) @@ -59,32 +59,32 @@ static void type_default_callback (void) //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置摄像头类型 // 参数说明 type_set 选定的摄像头类型 +// 参数说明 vsync_callback 设备的场中断回调函数 +// 参数说明 dma_callback 设备的 DMA 完成中断回调函数 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void // 使用示例 set_camera_type(CAMERA_GRAYSCALE); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- -void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) +void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback) { camera_type = type_set; - if(vsync_callback == NULL) camera_vsync_handler = type_default_callback; - else camera_vsync_handler = vsync_callback; - if(dma_callback == NULL) camera_dma_handler = type_default_callback; - else camera_dma_handler = dma_callback; - if(uart_callback == NULL) camera_uart_handler = type_default_callback; - else camera_uart_handler = uart_callback; + camera_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); + camera_vsync_handler = ((vsync_callback == NULL) ? (type_default_callback) : (vsync_callback)); + camera_dma_handler = ((dma_callback == NULL) ? (type_default_callback) : (dma_callback)); } //------------------------------------------------------------------------------------------------------------------- // 函数简介 设置无线模块类型 // 参数说明 type_set 选定的无线模块类型 +// 参数说明 uart_callback 设备的串口回调函数 // 返回参数 void -// 使用示例 set_wireless_type(WIRELESS_UART); +// 使用示例 set_wireless_type(WIRELESS_UART, uart_callback); // 备注信息 一般由各摄像头初始化内部调用 //------------------------------------------------------------------------------------------------------------------- void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback) { wireless_type = type_set; - if(uart_callback == NULL) wireless_module_uart_handler = type_default_callback; - else wireless_module_uart_handler = uart_callback; + wireless_module_uart_handler = ((uart_callback == NULL) ? (type_default_callback) : (uart_callback)); } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_type.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_type.h index 4b66bea..2c0a28f 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_type.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_type.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_type_h_ @@ -38,7 +39,7 @@ #include "zf_common_debug.h" -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== typedef enum { NO_CAMERE = 0, // 无摄像头 @@ -55,11 +56,11 @@ typedef enum BLUETOOTH_CH9141, // 蓝牙 CH9141 WIFI_UART, // 串口 WiFi }wireless_type_enum; -//==============================================定义 外设 枚举体================================================== +//==============================================定义 外设 参数结构体================================================== + +//===========================================声明 回调函数指针及外设 类型============================================== typedef void (*callback_function)(void); - -//===========================================声明回调函数指针及外设类型================================================== extern wireless_type_enum wireless_type; extern callback_function wireless_module_uart_handler; // 无线串口接收中断函数指针,根据初始化时设置的函数进行跳转 @@ -67,11 +68,12 @@ extern camera_type_enum camera_type; extern callback_function camera_dma_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_vsync_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 extern callback_function camera_uart_handler; // 串口通讯中断函数指针,根据初始化时设置的函数进行跳转 -//===========================================声明回调函数指针及外设类型================================================== +//===========================================声明 回调函数指针及外设 类型============================================== -//=============================================中断回调 基础函数=================================================== + +//=============================================声明 中断回调 基础函数================================================ void set_camera_type (camera_type_enum type_set, callback_function vsync_callback, callback_function dma_callback, callback_function uart_callback); void set_wireless_type (wireless_type_enum type_set, callback_function uart_callback); -//=============================================中断回调 基础函数=================================================== +//=============================================声明 中断回调 基础函数================================================ #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_virtual_oscilloscope.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_virtual_oscilloscope.c index 90075a8..6e44302 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_virtual_oscilloscope.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_virtual_oscilloscope.c @@ -54,7 +54,7 @@ static uint16 crc_check (uint8 *buff, uint8 crc_cnt) for(i = 0; i < crc_cnt; i ++) { crc_temp ^= buff[i]; - for(j = 0; j < 8; j ++) + for(j = 0; 8 > j; j ++) { if (crc_temp & 0x01) { diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_virtual_oscilloscope.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_virtual_oscilloscope.h index 6b5690c..2c954e1 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_virtual_oscilloscope.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_virtual_oscilloscope.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ #ifndef _zf_device_virtual_oscilloscope_h_ @@ -38,10 +39,13 @@ #include "zf_common_typedef.h" +//=================================================声明 虚拟示波器 全局变量================================================= extern uint8 virtual_oscilloscope_data[10]; +//=================================================声明 虚拟示波器 全局变量================================================= + +//=================================================声明 虚拟示波器 基础函数================================================= void virtual_oscilloscope_data_conversion (const int16 data1, const int16 data2, const int16 data3, const int16 data4); - - +//=================================================声明 虚拟示波器 基础函数================================================= #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wifi_uart.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wifi_uart.c index 47a6f17..25fafce 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wifi_uart.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wifi_uart.c @@ -57,7 +57,7 @@ #include "zf_device_type.h" #include "zf_device_wifi_uart.h" -#define WAIT_TIME_OUT (10000) // 单指令等待时间 单位:ms +#define WAIT_TIME_OUT ( 10000 ) // 单指令等待时间 单位:ms wifi_uart_information_struct wifi_uart_information; // 模块自身参数 @@ -91,7 +91,7 @@ static uint8 wifi_uart_wait_ack (char *wait_buffer, uint32 timeout) } else if(strstr(receiver_buffer, "ERROR") || strstr(receiver_buffer, "busy")) { - // 如果接收到报错或者模块忙 则跳出循环并且返回1 + // 如果接收到报错或者模块忙 则跳出循环并且返回 1 return_state = 1; break; } @@ -125,8 +125,8 @@ static void wifi_uart_clear_receive_buffer (void) static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char start_char, char end_char) { uint8 return_state = 0; - char *location1; - char *location2; + char *location1 = NULL; + char *location2 = NULL; location1 = strchr((char *)origin_buffer, start_char); if(location1) { @@ -157,12 +157,12 @@ static uint8 wifi_data_parse (uint8 *target_buffer, uint8 *origin_buffer, char s //-------------------------------------------------------------------------------------------------- static uint8 wifi_uart_get_version (void) { - char *location1; + char *location1 = NULL; uint8 return_state = 0; uint8 receiver_buffer[256]; uint32 receiver_len = 256; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+GMR\r\n"); do { @@ -197,12 +197,12 @@ static uint8 wifi_uart_echo_set (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "ATE"); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -222,7 +222,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+UART_CUR="); uart_write_string(WIFI_UART_INDEX, baudrate); uart_write_string(WIFI_UART_INDEX, ","); @@ -235,7 +235,7 @@ static uint8 wifi_uart_uart_config_set (char *baudrate, char *databits, char *st uart_write_string(WIFI_UART_INDEX, flow_control); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -253,7 +253,7 @@ static uint8 wifi_uart_get_mac (void) uint8 receiver_buffer[64]; uint32 receiver_len = 64; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPAPMAC?\r\n"); do { @@ -270,7 +270,7 @@ static uint8 wifi_uart_get_mac (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; @@ -287,12 +287,12 @@ static uint8 wifi_uart_get_ip (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_STATION) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_STATION == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSTA?\r\n"); } - else if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + else if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CIPAP?\r\n"); } @@ -313,7 +313,7 @@ static uint8 wifi_uart_get_ip (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -366,8 +366,8 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_information.wifi_uart_mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == wifi_uart_information.wifi_uart_mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWSAP=\""); uart_write_string(WIFI_UART_INDEX, wifi_ssid); @@ -384,7 +384,7 @@ static uint8 wifi_uart_set_wifi (char *wifi_ssid, char *pass_word) uart_write_string(WIFI_UART_INDEX, "\"\r\n"); } return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -400,12 +400,12 @@ static uint8 wifi_uart_auto_connect_wifi (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWAUTOCONN="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -421,12 +421,12 @@ static uint8 wifi_uart_set_connect_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMUX="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -443,12 +443,12 @@ static uint8 wifi_uart_set_transfer_model (char *model) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPMODE="); uart_write_string(WIFI_UART_INDEX, model); uart_write_string(WIFI_UART_INDEX, "\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -458,21 +458,21 @@ static uint8 wifi_uart_set_transfer_model (char *model) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_soft_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_soft_reset (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "+++"); system_delay_ms(100); uart_write_string(WIFI_UART_INDEX, "\r\n"); system_delay_ms(100); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+RST\r\n"); return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -482,7 +482,7 @@ uint8 wifi_uart_soft_reset (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_reset(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_reset (void) { @@ -493,9 +493,9 @@ uint8 wifi_uart_reset (void) system_delay_ms(50); gpio_set_level(WIFI_UART_RST_PIN, 1); system_delay_ms(200); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return_state = wifi_uart_wait_ack("ready", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; #else @@ -508,14 +508,14 @@ uint8 wifi_uart_reset (void) // 参数说明 state 0:无 Wi-Fi 模式,并且关闭 Wi-Fi RF----1: Station 模式----2: SoftAP 模式----3: SoftAP+Station 模式 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_set_model("1"); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SOFTAP) + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SOFTAP == mode) { uart_write_string(WIFI_UART_INDEX, "AT+CWMODE=2\r\n"); } @@ -526,7 +526,7 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 设置模块工作模式 wifi_uart_information.wifi_uart_mode = mode; return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -536,16 +536,16 @@ uint8 wifi_uart_set_model (wifi_uart_mode_enum mode) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnected_wifi(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnected_wifi (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CWQAP\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -555,30 +555,30 @@ uint8 wifi_uart_disconnected_wifi (void) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_entry_serianet(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_serianet (void) { uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND\r\n"); return_state = wifi_uart_wait_ack("OK", WAIT_TIME_OUT); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } //-------------------------------------------------------------------------------------------------- // 函数简介 退出透传模式 -// 参数说明 model 0:关闭透传模式 其他:开启透传模式 +// 参数说明 void // 返回参数 uint8 0:成功 1:失败 -// 使用示例 wifi_uart_exit_serianet(); -// 备注信息 +// 使用示例 wifi_uart_exit_serianet(); +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_serianet (void) { - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 system_delay_ms(20); uart_write_string(WIFI_UART_INDEX, "+++"); @@ -598,12 +598,12 @@ uint8 wifi_uart_exit_serianet (void) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); uint8 return_state = 0; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 do { if(wifi_uart_set_connect_model("0")) @@ -612,7 +612,7 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTARTEX=\"TCP\",\""); uart_write_string(WIFI_UART_INDEX, ip); @@ -626,16 +626,16 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 // 设置传输模式 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) { return_state = 1; break; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { @@ -648,14 +648,14 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo uint32 receiver_len = 128; fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); char* buffer_index = (char *)receiver_buffer; - char* end_index; + char* end_index = NULL; buffer_index += 22; buffer_index += strlen(ip); buffer_index += strlen(port); end_index = strchr(buffer_index, ','); - memcpy(wifi_uart_information.wifi_uart_local_port, " ", 9); + memcpy(wifi_uart_information.wifi_uart_local_port, " ", 7); memcpy(wifi_uart_information.wifi_uart_local_port, buffer_index, (end_index - buffer_index)); } @@ -663,8 +663,8 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -672,9 +672,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo break; } } - wifi_uart_send_buffer((uint8 *)"TCP connect!", 12); + }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -691,9 +691,9 @@ uint8 wifi_uart_connect_tcp_servers (char *ip, char *port, wifi_uart_transfer_mo //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi_uart_transfer_mode_enum mode) { - zf_assert(ip != NULL); - zf_assert(port != NULL); - zf_assert(local_port != NULL); + zf_assert(NULL != ip); + zf_assert(NULL != port); + zf_assert(NULL != local_port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -723,14 +723,14 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_set_transfer_model(mode == WIFI_UART_COMMAND ? "0" : "1")) // 设置传输模式 + if(wifi_uart_set_transfer_model(WIFI_UART_COMMAND == mode ? "0" : "1")) // 设置传输模式 { return_state = 1; break; } wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(mode == WIFI_UART_SERIANET) // 透传模式下直接开启透传 + if(WIFI_UART_SERIANET == mode) // 透传模式下直接开启透传 { if(wifi_uart_entry_serianet()) { @@ -743,7 +743,6 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi wifi_uart_information.wifi_uart_connect_state = WIFI_UART_SERVER_ON; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_UDP_CLIENT; wifi_uart_information.wifi_uart_transfer_mode = mode; - wifi_uart_send_buffer((uint8 *)"UDP connect!", 12); }while(0); wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -755,7 +754,7 @@ uint8 wifi_uart_connect_udp_client (char *ip, char *port, char *local_port, wifi // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link (void) { @@ -780,7 +779,7 @@ uint8 wifi_uart_disconnect_link (void) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -790,7 +789,7 @@ uint8 wifi_uart_disconnect_link (void) // 参数说明 link_id 将要断开的目标连接 // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_disconnect_link_with_id(WIFI_UART_LINK_0); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) { @@ -807,7 +806,6 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) } else { - return_state = 1; break; } @@ -818,7 +816,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) break; } }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -832,7 +830,7 @@ uint8 wifi_uart_disconnect_link_with_id (wifi_uart_link_id_enum link_id) //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_entry_tcp_servers (char *port) { - zf_assert(port != NULL); + zf_assert(NULL != port); uint8 return_state = 0; wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 @@ -868,7 +866,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) wifi_uart_information.wifi_uart_transfer_mode = WIFI_UART_COMMAND; wifi_uart_information.wifi_uart_connect_mode = WIFI_UART_TCP_SERVER; }while(0); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } @@ -878,7 +876,7 @@ uint8 wifi_uart_entry_tcp_servers (char *port) // 参数说明 void // 返回参数 uint8 0:成功 1:失败 // 使用示例 wifi_uart_exit_tcp_servers(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_exit_tcp_servers (void) { @@ -897,22 +895,22 @@ uint8 wifi_uart_exit_tcp_servers (void) // 参数说明 void // 返回参数 uint8 当前建立的连接数量 // 使用示例 wifi_uart_tcp_servers_check_link(); -// 备注信息 +// 备注信息 //-------------------------------------------------------------------------------------------------- uint8 wifi_uart_tcp_servers_check_link (void) { uint8 return_value = 0; uint8 loop_temp = 0; uint8 linke_index = 0; - + uint8 receiver_buffer[256]; uint32 receiver_len = 256; - char* buffer_index; - char* start_index; - char* end_index; - - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + char* buffer_index = NULL; + char* start_index = NULL; + char* end_index = NULL; + + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { memset(wifi_uart_information.wifi_uart_remote_ip[loop_temp], 0, 15); } @@ -920,11 +918,11 @@ uint8 wifi_uart_tcp_servers_check_link (void) wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_string(WIFI_UART_INDEX, "AT+CIPSTATE?\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) { fifo_read_buffer(&wifi_uart_fifo, receiver_buffer, &receiver_len, FIFO_READ_ONLY); buffer_index = (char *)receiver_buffer; - for(loop_temp = 0; loop_temp < 5; loop_temp ++) + for(loop_temp = 0; 5 > loop_temp; loop_temp ++) { start_index = strchr(buffer_index, ':'); if(NULL == start_index) @@ -948,25 +946,25 @@ uint8 wifi_uart_tcp_servers_check_link (void) // 函数简介 WiFi 模块 发送函数 // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_send_buffer("123", 3); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); int32 timeout = WAIT_TIME_OUT; char lenth[32] = {0}; - if(wifi_uart_information.wifi_uart_connect_state == WIFI_UART_SERVER_ON) + if(WIFI_UART_SERVER_ON == wifi_uart_information.wifi_uart_connect_state) { - if(wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND) + if(WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -974,7 +972,7 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - if(wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if(WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { uart_write_string(WIFI_UART_INDEX, "0,"); } @@ -982,22 +980,20 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } - wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 } } else { - while(len--) + while(len --) { while(gpio_get_level(WIFI_UART_RTS_PIN) && 0 < timeout -- ); // 如果RTS为低电平,则发送数据 if(0 >= timeout) @@ -1018,22 +1014,22 @@ uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len) // 参数说明 buff 需要发送的数据地址 // 参数说明 len 发送长度 // 参数说明 id 目标 client id -// 返回参数 uint16 剩余未发送数据长度 +// 返回参数 uint32 剩余未发送数据长度 // 使用示例 wifi_uart_tcp_servers_send_buffer("123", 3, WIFI_UART_LINK_0); // 备注信息 当模块作为TCP服务器时,发送数据函数默认将数据发送至第一个连接模块的客户端 //------------------------------------------------------------------------------------------------------------------- uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); char lenth[32] = {0}; - if( wifi_uart_information.wifi_uart_transfer_mode == WIFI_UART_COMMAND && \ - wifi_uart_information.wifi_uart_connect_mode == WIFI_UART_TCP_SERVER) + if( WIFI_UART_COMMAND == wifi_uart_information.wifi_uart_transfer_mode && \ + WIFI_UART_TCP_SERVER == wifi_uart_information.wifi_uart_connect_mode) { wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 func_int_to_str(lenth,len); - if(len > 8192) + if(8192 < len) { uart_write_string(WIFI_UART_INDEX, "AT+CIPSENDL="); } @@ -1041,19 +1037,19 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin { uart_write_string(WIFI_UART_INDEX, "AT+CIPSEND="); } - + uart_write_byte(WIFI_UART_INDEX, (id + '0')); uart_write_string(WIFI_UART_INDEX, ","); uart_write_string(WIFI_UART_INDEX, lenth); uart_write_string(WIFI_UART_INDEX, "\r\n"); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { // 模块允许发送数据 wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 uart_write_buffer(WIFI_UART_INDEX, buff, len); - if(wifi_uart_wait_ack("OK", WAIT_TIME_OUT) == 0) // 等待模块响应 + if(0 == wifi_uart_wait_ack("OK", WAIT_TIME_OUT)) // 等待模块响应 { len = 0; } @@ -1069,14 +1065,14 @@ uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_lin // 参数说明 len 数组长度,可直接填写或者使用sizeof求得 // 返回参数 uint16 返回实际接收到的数据长度 // 使用示例 uint8 test_buffer[256]; wifi_uart_read_buffer(&test_buffer[0], sizeof(test_buffer)); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wifi_uart_read_buffer (uint8 *buffer, uint32 len) +uint16 wifi_uart_read_buffer (uint8 *buffer, uint16 len) { - zf_assert(buffer != NULL); + zf_assert(NULL != buffer); uint32 read_len = len; fifo_read_buffer(&wifi_uart_fifo, buffer, &read_len, FIFO_READ_AND_CLEAN); - return read_len; + return (uint16)read_len; } //-------------------------------------------------------------------------------------------------- @@ -1106,8 +1102,8 @@ void wifi_uart_callback (void) //------------------------------------------------------------------------------------------------------------------- uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode) { - zf_assert(wifi_ssid != NULL); - zf_assert(pass_word != NULL); + zf_assert(NULL != wifi_ssid); + zf_assert(NULL != pass_word); char uart_baud[32] = {0}; uint8 return_state = 0; @@ -1144,7 +1140,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi uart_init(WIFI_UART_INDEX, WIFI_UART_BAUD, WIFI_UART_RX_PIN, WIFI_UART_TX_PIN); uart_rx_interrupt(WIFI_UART_INDEX, 1); system_delay_ms(100); - + if(wifi_uart_echo_set("0")) // 关闭模块回写 { zf_log(0, "exit echo failed"); @@ -1180,7 +1176,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi break; } #if WIFI_UART_AUTO_CONNECT == 1 - if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT,WIFI_UART_COMMAND)) // 连接TCP服务器 + if(wifi_uart_connect_tcp_servers(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_COMMAND)) // 连接TCP服务器 { zf_log(0, "connect TCP server failed"); return_state = 1; @@ -1188,7 +1184,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif #if WIFI_UART_AUTO_CONNECT == 2 - if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_COMMAND)) // 建立UDP连接 + if(wifi_uart_connect_udp_client(WIFI_UART_TARGET_IP, WIFI_UART_TARGET_PORT, WIFI_UART_LOCAL_PORT, WIFI_UART_SERIANET)) // 建立UDP连接 { zf_log(0, "connect UDP server failed"); return_state = 1; @@ -1204,7 +1200,7 @@ uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi } #endif }while(0); - + wifi_uart_clear_receive_buffer(); // 清空WiFi接收缓冲区 return return_state; } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wifi_uart.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wifi_uart.h index a898b4b..5ef5eda 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wifi_uart.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wifi_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -51,7 +52,7 @@ #include "zf_common_typedef.h" -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== #define WIFI_UART_INDEX (UART_2) // WIFI 模块 所使用到的串口 #define WIFI_UART_TX_PIN (UART2_RX_P10_6) // 连接 WIFI 模块 TX #define WIFI_UART_RX_PIN (UART2_TX_P10_5) // 连接 WIFI 模块 RX @@ -61,9 +62,10 @@ #if WIFI_UART_HARDWARE_RST // 建议使用硬件复位引脚 否则容易出现单片机复位后无法正常初始化模块 #define WIFI_UART_RST_PIN (P11_6) // 定义硬件复位引脚 #endif -//=================================================WIFI_UART 驱动配置==================================================== +//==============================================定义 WIFI_UART 基本配置=================================================== -//=================================================WIFI_UART 参数配置==================================================== + +//==============================================定义 WIFI_UART 基本参数=================================================== #define WIFI_UART_BUFFER_SIZE (256) // 定义接收缓存区大小 #define WIFI_UART_AUTO_CONNECT (0) // 定义是否初始化时建立TCP或者UDP连接 0-不连接 1-自动连接TCP服务器 2-自动连接UDP服务器 3:自动建立TCP服务器 @@ -75,9 +77,9 @@ #define WIFI_UART_TARGET_PORT "8080" // 连接目标的端口 #define WIFI_UART_LOCAL_PORT "8080" // 本机端口 #endif -//=================================================WIFI_UART 参数配置==================================================== +//==============================================定义 WIFI_UART 基本参数=================================================== -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== typedef enum { WIFI_UART_STATION, // 设备模式 @@ -118,17 +120,21 @@ typedef struct uint8 wifi_uart_mac[20]; // 本机 MAC 地址 字符串形式 uint8 wifi_uart_local_ip[17]; // 本机 IP 地址 字符串形式 uint8 wifi_uart_local_port[10]; // 本机端口号 字符串形式 - uint8 wifi_uart_remote_ip[5][15]; // 远端 IP 地址 字符串形式 + uint8 wifi_uart_remote_ip[5][17]; // 远端 IP 地址 字符串形式 wifi_uart_mode_enum wifi_uart_mode; // WIFI 模式 wifi_uart_transfer_mode_enum wifi_uart_transfer_mode; // 当前传输模式 wifi_uart_connect_mode_enum wifi_uart_connect_mode; // 网络连接模式 wifi_uart_connect_state_enum wifi_uart_connect_state; // 服务器连接情况 }wifi_uart_information_struct; -//=================================================WIFI_UART 参数枚举==================================================== +//==============================================定义 WIFI_UART 参数结构体================================================== + +//==============================================定义 WIFI_UART 全局变量=================================================== extern wifi_uart_information_struct wifi_uart_information; +//==============================================定义 WIFI_UART 全局变量=================================================== -//=================================================WIFI_UART 基础函数==================================================== + +//==============================================定义 WIFI_UART 基础函数=================================================== uint8 wifi_uart_disconnected_wifi (void); // 断开 WIFI 连接 uint8 wifi_uart_entry_serianet (void); // 打开透传模式 uint8 wifi_uart_exit_serianet (void); // 关闭透传模式 @@ -144,10 +150,10 @@ uint8 wifi_uart_tcp_servers_check_link (void); uint32 wifi_uart_send_buffer (uint8 *buff, uint32 len); // WIFI 模块数据发送函数 uint32 wifi_uart_tcp_servers_send_buffer (uint8 *buff, uint32 len, wifi_uart_link_id_enum id); // WIFI 模块作为 TCP Server 指定目标设备发送函数 -uint32 wifi_uart_read_buffer (uint8 *buff, uint32 len); // WIFI 模块数据接收函数 +uint16 wifi_uart_read_buffer (uint8 *buff, uint16 len); // WIFI 模块数据接收函数 void wifi_uart_callback (void); // WIFI 模块串口回调函数 uint8 wifi_uart_init (char *wifi_ssid, char *pass_word, wifi_uart_mode_enum wifi_mode); // WIFI 模块初始化函数 -//=================================================WIFI_UART 基础函数==================================================== +//==============================================定义 WIFI_UART 基础函数=================================================== #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wireless_uart.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wireless_uart.c index 14d0f31..233ebf4 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wireless_uart.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wireless_uart.c @@ -53,19 +53,21 @@ #include "zf_device_type.h" #include "zf_device_wireless_uart.h" -static fifo_struct wireless_uart_fifo; -static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; // 数据存放数组 +static fifo_struct wireless_uart_fifo; +static uint8 wireless_uart_buffer[WIRELESS_UART_BUFFER_SIZE]; -static uint8 wireless_uart_data; -volatile uint32 wireless_auto_baud_flag = 0; -volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +static uint8 wireless_uart_data = 0; +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +static volatile wireless_uart_auto_baudrate_state_enum wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; +static volatile uint8 wireless_auto_baud_data[3] = {0x00, 0x01, 0x03}; +#endif //------------------------------------------------------------------------------------------------------------------- // 函数简介 无线转串口模块 发送数据 // 参数说明 data 8bit 数据 -// 返回参数 uint32 剩余发送长度 +// 返回参数 uint32 剩余发送长度 0-发送完毕 1-未发送完成 // 使用示例 wireless_uart_send_byte(data); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_byte (const uint8 data) { @@ -80,7 +82,7 @@ uint32 wireless_uart_send_byte (const uint8 data) time_count --; system_delay_ms(1); } - return (0 < time_count); + return (0 == time_count); } //------------------------------------------------------------------------------------------------------------------- @@ -88,27 +90,27 @@ uint32 wireless_uart_send_byte (const uint8 data) // 参数说明 *buff 发送缓冲区 // 参数说明 len 发送数据长度 // 返回参数 uint32 剩余发送长度 -// 使用示例 wireless_uart_send_buff(buff, 64); -// 备注信息 +// 使用示例 wireless_uart_send_buffer(buff, 64); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint16 time_count = 0; while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, 30); // 发送数据 buff += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, buff, len); // 发送数据 len = 0; break; } @@ -130,27 +132,27 @@ uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len) // 参数说明 *str 要发送的字符串地址 // 返回参数 uint32 剩余发送长度 // 使用示例 wireless_uart_send_string("Believe in yourself."); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint32 wireless_uart_send_string (const char *str) { - zf_assert(str != NULL); + zf_assert(NULL != str); uint16 time_count = 0; uint32 len = strlen(str); while(0 != len) { - if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 + if(!gpio_get_level(WIRELESS_UART_RTS_PIN)) // 如果RTS为低电平 则继续发送数据 { if(30 <= len) // 数据分 30byte 每包发送 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, 30); // 发送数据 str += 30; // 地址偏移 len -= 30; // 数量 time_count = 0; } else // 不足 30byte 的数据一次性发送完毕 { - uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len); // 发送数据 + uart_write_buffer(WIRELESS_UART_INDEX, (const uint8 *)str, len);// 发送数据 len = 0; break; } @@ -173,14 +175,14 @@ uint32 wireless_uart_send_string (const char *str) // 参数说明 image_size 图像的大小 // 返回参数 void // 使用示例 wireless_uart_send_image(&mt9v03x_image[0][0], MT9V03X_IMAGE_SIZE); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) { - zf_assert(image_addr != NULL); + zf_assert(NULL != image_addr); extern uint8 camera_send_image_frame_header[4]; - wireless_uart_send_buff(camera_send_image_frame_header, 4); - wireless_uart_send_buff((uint8 *)image_addr, image_size); + wireless_uart_send_buffer(camera_send_image_frame_header, 4); + wireless_uart_send_buffer((uint8 *)image_addr, image_size); } //------------------------------------------------------------------------------------------------------------------- @@ -188,12 +190,12 @@ void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size) // 参数说明 *buff 接收缓冲区 // 参数说明 len 读取数据长度 // 返回参数 uint32 实际读取数据长度 -// 使用示例 wireless_uart_read_buff(buff, 32); -// 备注信息 +// 使用示例 wireless_uart_read_buffer(buff, 32); +// 备注信息 //------------------------------------------------------------------------------------------------------------------- -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len) +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len) { - zf_assert(buff != NULL); + zf_assert(NULL != buff); uint32 data_len = len; fifo_read_buffer(&wireless_uart_fifo, buff, &data_len, FIFO_READ_AND_CLEAN); return data_len; @@ -213,10 +215,11 @@ void wireless_uart_callback (void) uart_query_byte(WIRELESS_UART_INDEX, &wireless_uart_data); fifo_write_buffer(&wireless_uart_fifo, &wireless_uart_data, 1); #if WIRELESS_UART_AUTO_BAUD_RATE // 开启自动波特率 - if(wireless_auto_baud_flag == 1 && fifo_used(&wireless_uart_fifo) == 3) + if(WIRELESS_UART_AUTO_BAUD_RATE_START == wireless_auto_baud_flag && 3 == fifo_used(&wireless_uart_fifo)) { - wireless_auto_baud_flag = 3; - fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_flag, FIFO_READ_AND_CLEAN); + uint32 wireless_auto_baud_count = 3; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK; + fifo_read_buffer(&wireless_uart_fifo, (uint8 *)wireless_auto_baud_data, (uint32 *)&wireless_auto_baud_count, FIFO_READ_AND_CLEAN); } #endif } @@ -226,7 +229,7 @@ void wireless_uart_callback (void) // 参数说明 void // 返回参数 void // 使用示例 wireless_uart_init(); -// 备注信息 +// 备注信息 //------------------------------------------------------------------------------------------------------------------- uint8 wireless_uart_init (void) { @@ -240,10 +243,10 @@ uint8 wireless_uart_init (void) uart_init (WIRELESS_UART_INDEX, WIRELESS_UART_BUAD_RATE, WIRELESS_UART_RX_PIN, WIRELESS_UART_TX_PIN); // 初始化串口 uart_rx_interrupt(WIRELESS_UART_INDEX, 1); #elif(1 == WIRELESS_UART_AUTO_BAUD_RATE) // 开启自动波特率 - uint8 rts_init_status; + uint8 rts_init_status = 0; uint16 time_count = 0; - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_INIT; wireless_auto_baud_data[0] = 0; wireless_auto_baud_data[1] = 1; wireless_auto_baud_data[2] = 3; @@ -257,24 +260,17 @@ uint8 wireless_uart_init (void) system_delay_ms(5); // 模块上电之后需要延时等待 gpio_set_level(WIRELESS_UART_RTS_PIN, !rts_init_status); // RTS引脚拉高,进入自动波特率模式 system_delay_ms(100); // RTS拉高之后必须延时20ms - gpio_toggle(WIRELESS_UART_RTS_PIN); // RTS引脚取反 + gpio_toggle_level(WIRELESS_UART_RTS_PIN); // RTS引脚取反 - wireless_auto_baud_flag = 1; - - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 - uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 - system_delay_ms(20); - - time_count = 0; do { - if(3 != wireless_auto_baud_flag) // 检验自动波特率是否完成 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_START; + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[0]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[1]); // 发送特定数据 用于模块自动判断波特率 + uart_write_byte(WIRELESS_UART_INDEX, wireless_auto_baud_data[2]); // 发送特定数据 用于模块自动判断波特率 + system_delay_ms(20); + + if(WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK != wireless_auto_baud_flag) // 检验自动波特率是否完成 { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; @@ -284,16 +280,11 @@ uint8 wireless_uart_init (void) if( 0xa5 != wireless_auto_baud_data[0] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[1] && // 检验自动波特率是否正确 0xff != wireless_auto_baud_data[2] ) // 检验自动波特率是否正确 - { - while(time_count ++) - system_delay_ms(1); - } - if(time_count >= WIRELESS_UART_TIMEOUT_COUNT) { return_state = 1; // 如果程序进入到此语句内 说明自动波特率失败了 break; } - wireless_auto_baud_flag = 0; + wireless_auto_baud_flag = WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS; gpio_init(WIRELESS_UART_RTS_PIN, GPI, 0, GPI_PULL_UP); // 初始化流控引脚 system_delay_ms(10); // 延时等待 模块准备就绪 diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wireless_uart.h b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wireless_uart.h index bef336d..a5db840 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wireless_uart.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_wireless_uart.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 增加中文注释说明 ********************************************************************************************************************/ /********************************************************************************************************************* * 接线定义: @@ -49,15 +50,13 @@ #define _zf_device_wireless_uart_h_ #include "zf_common_typedef.h" -//=================================================无线串口 驱动配置==================================================== +//================================================定义 无线串口 基本配置=================================================== #define WIRELESS_UART_INDEX (UART_2) // 无线串口对应使用的串口号 #define WIRELESS_UART_BUAD_RATE (115200) // 无线串口对应使用的串口波特率 #define WIRELESS_UART_TX_PIN (UART2_RX_P10_6) // 无线串口对应模块的 TX 要接到单片机的 RX #define WIRELESS_UART_RX_PIN (UART2_TX_P10_5) // 无线串口对应模块的 RX 要接到单片机的 TX #define WIRELESS_UART_RTS_PIN (P10_2) // 无线串口对应模块的 RTS 引脚 -//=================================================无线串口 驱动配置==================================================== - -//================================================无线串口 自动波特率==================================================== +//====================================================自动波特率==================================================== // 注意事项1:无线转串口模块版本是V2.0以下的是无法开启自动波特率的。 // 注意事项2:开启自动波特率务必连接RTS引脚 否则会开启失败。 // 注意事项3:模块自动波特率失败的话 可以尝试断电重启 @@ -66,27 +65,38 @@ // 开启自动波特率务必阅读上面两条 注意事项 // 开启自动波特率务必阅读上面两条 注意事项 -// 0:关闭自动波特率 +// 0:关闭自动波特率 // 1:开启自动波特率 自动波特率的作用是修改 WIRELESS_UART_BAUD 之后不需要对模块进行配置 模块会自动设置为对应的波特率 -#define WIRELESS_UART_AUTO_BAUD_RATE (0) -//================================================无线串口 自动波特率==================================================== +#define WIRELESS_UART_AUTO_BAUD_RATE ( 1 ) +//====================================================自动波特率==================================================== +#if (1 == WIRELESS_UART_AUTO_BAUD_RATE) +typedef enum +{ + WIRELESS_UART_AUTO_BAUD_RATE_SUCCESS, + WIRELESS_UART_AUTO_BAUD_RATE_INIT, + WIRELESS_UART_AUTO_BAUD_RATE_START, + WIRELESS_UART_AUTO_BAUD_RATE_GET_ACK, +}wireless_uart_auto_baudrate_state_enum; +#endif -#define WIRELESS_UART_BUFFER_SIZE (64 ) -#define WIRELESS_UART_TIMEOUT_COUNT (0x64) +#define WIRELESS_UART_BUFFER_SIZE ( 64 ) +#define WIRELESS_UART_TIMEOUT_COUNT ( 0x64 ) +//================================================定义 无线串口 基本配置=================================================== -//=================================================无线串口 基础函数==================================================== + +//================================================声明 无线串口 基础函数=================================================== uint32 wireless_uart_send_byte (const uint8 data); -uint32 wireless_uart_send_buff (const uint8 *buff, uint32 len); +uint32 wireless_uart_send_buffer (const uint8 *buff, uint32 len); uint32 wireless_uart_send_string (const char *str); void wireless_uart_send_image (const uint8 *image_addr, uint32 image_size); -uint32 wireless_uart_read_buff (uint8 *buff, uint32 len); +uint32 wireless_uart_read_buffer (uint8 *buff, uint32 len); void wireless_uart_callback (void); uint8 wireless_uart_init (void); -//=================================================无线串口 基础函数==================================================== +//================================================声明 无线串口 基础函数=================================================== #endif diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.c b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.c index 07e6929..09266aa 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.c +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.c @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #include "IFXQSPI_REGDEF.h" @@ -42,7 +43,7 @@ #include "zf_driver_spi.h" #define MAX_BAUD 50000000 -Ifx_QSPI_BACON bacon; +Ifx_QSPI_BACON bacon[4]; spi_cs_pin_enum spi_cs_pin; void spi_mux (spi_index_enum spi_n, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin, IfxQspi_SpiMaster_Pins *set_pin, IfxQspi_SpiMaster_Output *set_cs) @@ -226,7 +227,7 @@ void spi_write_8bit (spi_index_enum spi_n, const uint8 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -252,13 +253,13 @@ void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 do { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -285,13 +286,13 @@ void spi_write_16bit (spi_index_enum spi_n, const uint16 data) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((data & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -316,7 +317,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 do { @@ -327,7 +328,7 @@ void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -356,7 +357,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -364,7 +365,7 @@ void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, c while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, data); // 将发送的数据写入缓冲区 @@ -391,7 +392,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -401,7 +402,7 @@ void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *data ++); // 将发送的数据写入缓冲区 @@ -430,7 +431,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -444,7 +445,7 @@ void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, while(moudle->STATUS.B.TXFIFOLEVEL != 0); // 等待发送完毕 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, (uint8)(data & 0x00FF)); // 将发送的数据写入缓冲区 @@ -471,7 +472,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -489,7 +490,7 @@ void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*data ++ & 0x00FF)); // 将发送的数据写入缓冲区 @@ -517,7 +518,7 @@ uint8 spi_read_8bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -547,7 +548,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -555,7 +556,7 @@ void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len) { if(len == 1) // 最后一个数据 { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -586,7 +587,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U);// 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U);// 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -596,7 +597,7 @@ uint16 spi_read_16bit (spi_index_enum spi_n) data = (uint16)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -626,7 +627,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -640,7 +641,7 @@ void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len) if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -675,7 +676,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -683,7 +684,7 @@ uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name) spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -714,7 +715,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, register_name); // 将发送的数据写入缓冲区 @@ -726,7 +727,7 @@ void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, u { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -761,7 +762,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -779,7 +780,7 @@ uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name data |= (uint8)IfxQspi_readReceiveFifo(moudle); // 保存接收到的数据 - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -813,7 +814,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, spi_clear_fifo(moudle); // 清除接收缓存区 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 IfxQspi_writeTransmitFifo(moudle, (uint8)((register_name & 0xFF00) >> 8)); // 将发送的数据写入缓冲区 @@ -835,7 +836,7 @@ void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, 0); // 将发送的数据写入缓冲区 @@ -868,7 +869,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -876,7 +877,7 @@ void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 * { if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, *write_buffer ++); // 将发送的数据写入缓冲区 @@ -913,7 +914,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 moudle = IfxQspi_getAddress((IfxQspi_Index)spi_n); // 获取模块地址 - IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon.U); // 发送数据后CS继续保持为低 + IfxQspi_writeBasicConfigurationBeginStream(moudle, bacon[spi_n].U); // 发送数据后CS继续保持为低 spi_clear_fifo(moudle); // 清除接收缓存区 @@ -933,7 +934,7 @@ void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint1 if(len == 1) { - IfxQspi_writeBasicConfigurationEndStream(moudle, bacon.U); // 发送数据后CS拉高 + IfxQspi_writeBasicConfigurationEndStream(moudle, bacon[spi_n].U); // 发送数据后CS拉高 } IfxQspi_writeTransmitFifo(moudle, (uint8)(*write_buffer & 0x00FF)); // 将发送的数据写入缓冲区 @@ -1057,17 +1058,17 @@ void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pi IfxQspi_configPT1Event(moudle, IfxQspi_PhaseTransitionEvent_endOfFrame); - bacon.U = moudle->BACON.U; - bacon.B.DL = 7; // Data Length - bacon.B.IDLE = 1; // Idle Delay Length - bacon.B.IPRE = 1; // Prescaler for the Idle Delay - bacon.B.LEAD = 1; // Leading Delay Length - bacon.B.LPRE = 1; // Prescaler for the Leading Delay - bacon.B.MSB = 1; // Shift MSB or LSB First - bacon.B.PARTYP = 0; // Parity Type - bacon.B.BYTE = 0; // Byte - bacon.B.TRAIL = 1; // Trailing Delay Length - bacon.B.TPRE = 1; // Prescaler for the Trailing Delay - bacon.B.CS = cs_pin%102/6-3; + bacon[spi_n].U = moudle->BACON.U; + bacon[spi_n].B.DL = 7; // Data Length + bacon[spi_n].B.IDLE = 1; // Idle Delay Length + bacon[spi_n].B.IPRE = 1; // Prescaler for the Idle Delay + bacon[spi_n].B.LEAD = 1; // Leading Delay Length + bacon[spi_n].B.LPRE = 1; // Prescaler for the Leading Delay + bacon[spi_n].B.MSB = 1; // Shift MSB or LSB First + bacon[spi_n].B.PARTYP = 0; // Parity Type + bacon[spi_n].B.BYTE = 0; // Byte + bacon[spi_n].B.TRAIL = 1; // Trailing Delay Length + bacon[spi_n].B.TPRE = 1; // Prescaler for the Trailing Delay + bacon[spi_n].B.CS = cs_pin%102/6-3; } diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.h b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.h index 3824b87..a17adc7 100644 --- a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.h +++ b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_spi.h @@ -31,6 +31,7 @@ * 修改记录 * 日期 作者 备注 * 2022-09-15 pudding first version +* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题 ********************************************************************************************************************/ #ifndef _zf_driver_spi_h_ diff --git a/Seekfree_TC264_Opensource_Library/user/cpu0_main.c b/Seekfree_TC264_Opensource_Library/user/cpu0_main.c index d9ac2da..d6ecb49 100644 --- a/Seekfree_TC264_Opensource_Library/user/cpu0_main.c +++ b/Seekfree_TC264_Opensource_Library/user/cpu0_main.c @@ -72,4 +72,3 @@ int core0_main(void) #pragma section all restore // **************************** 代码区域 **************************** -